Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess 如何从相对路径获取完整路径_.htaccess_Relative Path_Absolute Path - Fatal编程技术网

.htaccess 如何从相对路径获取完整路径

.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

我试图从另一个域访问一个页面,我可以从php获取所有其他html,但是像图像和音频文件这样的文件有相关路径,使得它们可以在本地服务器中查看,而它们在另一个服务器上

我允许从另一个页面通过PHP进行跨域访问

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客户端。你能给出一个更详细的服务器端示例吗当然,看看服务器端。如果你觉得有用,请投票:)