.htaccess 如何从相对路径获取完整路径
我试图从另一个域访问一个页面,我可以从php获取所有其他html,但是像图像和音频文件这样的文件有相关路径,使得它们可以在本地服务器中查看,而它们在另一个服务器上 我允许从另一个页面通过PHP进行跨域访问.htaccess 如何从相对路径获取完整路径,.htaccess,relative-path,absolute-path,.htaccess,Relative Path,Absolute Path,我试图从另一个域访问一个页面,我可以从php获取所有其他html,但是像图像和音频文件这样的文件有相关路径,使得它们可以在本地服务器中查看,而它们在另一个服务器上 我允许从另一个页面通过PHP进行跨域访问 header('Access-Control-Allow-Origin: *'); 然后我使用AJAX加载来加载页面的内容 $('#local_div').load('page_to_load_on_side_B #div_on_that_page'); 现在,路径如下所示: inclu
header('Access-Control-Allow-Origin: *');
然后我使用AJAX加载来加载页面的内容
$('#local_div').load('page_to_load_on_side_B #div_on_that_page');
现在,路径如下所示:
include(dirname(__FILE__) . "/dir/script_name.php");
script_name = basename(__FILE__);
../../user/6/535e55ed00978.jpg
但我希望它像这样充满
http://www.siteB.com/user/6/535e55ed00978.jpg
更正:我可以完全访问这两个站点,因此我需要从这些文件的原始站点获取绝对路径。有一个PHP函数,可以从相对路径生成绝对路径
如果您指的是URL路径,只需替换所有出现的“./”并在前面添加域。对于此问题,请使用以下方法之一: 服务器端方法 我将在服务器B中创建一个名为例如
abspath
的参数。当此参数设置为1时,脚本将启动一个输出缓冲区ob_start()
,然后在提交之前使用ob_get_clean()
获取ob内容,最后使用正则表达式替换http/:www.siteB.com/
。因此,服务器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;
}
?>
所以,当abspath参数设置为1时,站点B脚本将把相对路径(注意,我猜所有路径都是../)替换为绝对路径。这种方法可以改进很多
客户端方法
此替换将在本地JavaScript中完成,以避免更改服务器B脚本。Javascript中的替换将是相同的。如果所有相对路径都以。/..
开头,则正则表达式非常简单,因此在站点A中替换$(“#local_div”).load('page#u to_load_on_side#B#div_on_the#u page')代码>用于以下内容(请注意,我估计所有相关URL都以。/..
开头):
这将在将html设置为DIV
之前进行替换,以便从绝对URL加载图像
确保CORS完全进入现场B
第二种方法比第一种方法干净,所以我想应该使用Javascript来进行替换,这两种方法都是相同的,只是在替换完成的地方进行了更改。试试这一种:
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);
}
您还可以找到以下解决方案:
通常,此问题有两种解决方案:
1) 使用$_SERVER[“DOCUMENT_ROOT”]–我们可以使用此变量使所有包含相对于服务器根目录,而不是当前工作目录(脚本的目录)。然后,我们将使用类似于以下内容的内容:
include($_SERVER["DOCUMENT_ROOT"] . "/dir/script_name.php");
2) Use dirname(FILE)–FILE常量包含所用脚本的完整路径和文件名。函数dirname()从路径中删除文件名,为我们提供文件所在目录的绝对路径,而不考虑包含该文件的脚本。使用它,我们可以选择使用相对路径,就像使用任何其他语言(如C/C++)一样。我们将在所有相对路径前加前缀,如下所示:
include(dirname(__FILE__) . "/dir/script_name.php");
script_name = basename(__FILE__);
您还可以使用basename()和dirname()查找包含的脚本名称,而不仅仅是当前执行脚本的名称,如下所示:
include(dirname(__FILE__) . "/dir/script_name.php");
script_name = basename(__FILE__);
我个人更喜欢第二种方法而不是第一种方法,因为它给了我更多的自由和更好的方法来创建模块化的web应用程序
注意:请记住,在基于Unix的系统中使用反斜杠“\”和正斜杠“/”是有区别的。如果您在windows计算机上测试应用程序,并且可以互换使用这些应用程序,那么它可以正常工作。但是,一旦您尝试将脚本移动到Unix服务器,就会导致一些问题。与Unix中一样,PHP中也使用反斜杠(\),以指示后面的字符是特殊字符。因此,请注意不要在路径名中使用这些名称。对siteB具有完全访问权限,这必须发生在服务器端,因为数据必须从sideA服务器端处理到sideB客户端。你能给出一个更详细的服务器端示例吗当然,看看服务器端。如果你觉得有用,请投票:)