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

时间:2014-06-07 10:54:38

标签: .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');

现在,路径看起来像这样:

  

../../用户/ 6 / 535e55ed00978.jpg

但是我希望它像是一样完整。

  

的http //:www.siteB.com/user/6/535e55ed00978.jpg

更正:我可以完全访问这两个网站,因此我需要从这些文件所在的网站获取绝对路径。

3 个答案:

答案 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)

有一个PHP函数可以从相对路径创建绝对路径。

realpath()

如果您指的是网址路径,只需替换所有出现的“../”并在前面添加域名。

答案 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,以指示后面的字符是特殊字符。因此,请注意不要在路径名中使用这些。