我从我的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:这可能听起来像是重复的,但过去两个小时我花了很多时间寻找答案。
答案 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;
}