在PHP中将物理路径转换为VIrtual路径

时间:2011-12-06 12:15:46

标签: php

我从我的php脚本返回HTML(包括IMG SRC属性),我不能对绝对目录结构做任何假设。我可以做相对的参考。

假设我的目录在我的机器上看起来像这样:

/abc/php.php

/abc/img/1.png

现在,这可以托管在某些服务器上:

/xyz/php.php

/xyz/img/1.png

我需要<img src="???"><form action="???">,因为它适用于两种情况。这就是我需要弄清楚如何从1.png引用php.php,这样无论网站在何处托管,它都能正常工作。

我不能使用像src="/img/some.png"这样的东西,因为这绝对来自DOCUMENT_ROOT。我不能对托管DOCUMENT_ROOT脚本的相对位置做出任何假设。如何在不假设DOCUMENT_ROOT的路径的情况下引用HTML中的资源。

基本上,我正在寻找realpath的反向,我正在使用纯PHP不使用任何框架。

PS:这可能听起来像是重复的,但过去两个小时我花了很多时间寻找答案。

3 个答案:

答案 0 :(得分:2)

我通常使用wordpress使用的解决方案,其中绝对路径由用户在配置部分(如果存在这样的部分)或配置文件内定义。
然后我定义一个这样的函数:

function base($tail = ''){
    global $config;
    echo 'http://',$_SERVER['SERVER_NAME'],'/',$config['path'],'/',$tail;
}

答案 1 :(得分:0)

如果您知道它们将部署在同一个文件系统树中,那么可以向上搜索以找到名为“img”的目录

function get_top_dir($currdir, $search)
{
   if (file_exists($currdir . '/' . $search)) {
      return $currdir;
   }
   if (dirname($currdir)===$currdir) {
      trigger_error("not found");
      return false;
   }
   return get_top_dir(dirname($currdir), $search);
}

然后根据当前脚本的文件名将其映射到相对URL,或者根据当前脚本的文件名和URL将其映射到绝对URL。这个代码会有点复杂。

但实际上使用配置文件要简单得多。

答案 2 :(得分:0)

此函数返回采用任何物理路径并将其转换为虚拟路径:

 function get_virtual_path($physical_path) {
        $physical_path = str_replace('\\', '/', $physical_path);  
        $document_root_path = str_replace('\\', '/', $_SERVER["DOCUMENT_ROOT"]);
        $path=  str_replace($document_root_path, "", $physical_path);
        $http = isset($_SERVER ['HTTPS']) ? 'https://' : 'http://';
        $host = $_SERVER['HTTP_HOST'];
        return  $http . $host . $path; 

    }