我正在尝试从另一个域访问一个页面,我可以从php获取所有其他html,但像图像和音频文件这样的文件具有相对路径,使得它们可以在本地服务器内部查看,而它们位于其他服务器。
我允许从其他页面通过PHP进行跨域访问。
header('Access-Control-Allow-Origin: *');
然后我使用AJAX加载来加载页面的内容。
$('#local_div').load('page_to_load_on_side_B #div_on_that_page');
现在,路径看起来像这样:
../../用户/ 6 / 535e55ed00978.jpg
但是我希望它像是一样完整。
的http //:www.siteB.com/user/6/535e55ed00978.jpg
更正:我可以完全访问这两个网站,因此我需要从这些文件所在的网站获取绝对路径。
答案 0 :(得分:1)
对于此问题,请使用以下方法之一:
服务器端方法
我会在服务器B中创建一个名为abspath
的参数。当此参数设置为1时,脚本将启动输出缓冲区ob_start()
,然后在提交之前将使用ob_get_clean()
获取ob内容,最后使用正则表达式替换http//:www.siteB.com/
的所有URL。因此,服务器A上的脚本如下所示:
<?php
$abspath=(isset($_REQUEST["abspath"])?$_REQUEST["abspath"]:0);
if($abspath==1) ob_start();
// Do page processing (your actual code here)
if($abspath==1)
{
$html=ob_get_clean();
$html=preg_replace("\.\.\/\.\.\/", "http://siteb.com/");
echo $html;
}
?>
因此,在客户端(站点A),您的ajax调用将是:
$('#local_div').load('page_to_load_on_side_B?abspath=1#div_on_that_page');
因此,当abspath param设置为1时,B脚本会将相对路径(注意我猜测所有路径为../ ..)替换为绝对路径。这种方法可以大大改进。
客户端方法
此替换将在本地JavaScript中完成,避免更改服务器B脚本,。 Javascript中的替换将是相同的。如果所有相对路径都以../..
开头,则正则表达式非常简单,因此在站点A中替换$('#local_div').load('page_to_load_on_side_B #div_on_that_page');
以获取以下内容(请注意,我认为所有亲属URL都以../..
开头):
$.get('page_to_load_on_side_B #div_on_that_page', function(data) {
data=data.replace(/\.\.\/\.\.\//, 'http://siteb.com/');
$('#local_div').html(data);
});
在将html设置为DIV
之前,这将进行替换,因此将从绝对URL加载图像。
确保对站点B的完整CORS访问。
第二种方法比第一种方法干净,所以我想使用Javascript来进行替换,两者都是替换完成后的唯一更改。
答案 1 :(得分:0)
答案 2 :(得分:0)
试试这个:
function getRelativePath($from, $to)
{
// some compatibility fixes for Windows paths
$from = is_dir($from) ? rtrim($from, '\/') . '/' : $from;
$to = is_dir($to) ? rtrim($to, '\/') . '/' : $to;
$from = str_replace('\\', '/', $from);
$to = str_replace('\\', '/', $to);
$from = explode('/', $from);
$to = explode('/', $to);
$relPath = $to;
foreach($from as $depth => $dir) {
// find first non-matching dir
if($dir === $to[$depth]) {
// ignore this directory
array_shift($relPath);
} else {
// get number of remaining dirs to $from
$remaining = count($from) - $depth;
if($remaining > 1) {
// add traversals up to first matching dir
$padLength = (count($relPath) + $remaining - 1) * -1;
$relPath = array_pad($relPath, $padLength, '..');
break;
} else {
$relPath[0] = './' . $relPath[0];
}
}
}
return implode('/', $relPath);
}
您也可以找到以下解决方案:
一般来说,这个问题有2个解决方案:
1)使用$ _SERVER [“DOCUMENT_ROOT”] - 我们可以使用此变量来生成相对于服务器根目录的所有包含,而不是当前工作目录(脚本的目录)。然后我们会为我们所有的包含使用类似的东西:
include($_SERVER["DOCUMENT_ROOT"] . "/dir/script_name.php");
2)使用dirname( FILE ) - FILE 常量包含其使用的脚本的完整路径和文件名。函数dirname()删除路径中的文件名,为我们提供文件所在目录的绝对路径,而不管它包含哪个脚本。使用它可以让我们像使用其他语言一样使用相对路径,比如C / C ++。我们将这样的所有相对路径加上前缀:
include(dirname(__FILE__) . "/dir/script_name.php");
您也可以使用basename()和dirname()来查找包含的脚本名称,而不仅仅是当前正在执行的脚本的名称,如下所示:
script_name = basename(__FILE__);
我个人比第一种方法更喜欢第一种方法,因为它为我提供了更多自由和更好的方法来创建模块化Web应用程序。
注意:请记住,在基于Unix的系统下使用反斜杠“\”和正向(普通)斜杠“/”之间存在差异。如果您在Windows机器上测试应用程序并且可以互换使用它,它将正常工作。但是一旦你试图将你的脚本移动到Unix服务器,它将导致一些问题。反斜杠(“\”)也在PHP中用于Unix,以指示后面的字符是特殊字符。因此,请注意不要在路径名中使用这些。