地带文档根

问题描述:

OK,我已经定义了一个指向文件中像这样的服务器上的PHP常数:地带文档根

define('SOME_FILE', str_replace('//', '/', str_replace('\\', '/', dirname(__FILE__) . '/foo-bar.txt'))); 

SOME_FILE将包含一个完整路径+文件名是在useble PHP函数如include,fopen等。现在,如果我想在我的(X)HTML输出中使用此路径作为URL,我就搞砸了。为此,我需要剥离文档根目录。

通常情况下,$_SERVER['DOCUMENT_ROOT']在99%的PHP环境中设置,但它可能发生在配置不当,被用户覆盖或甚至丢失的位置。

现在我想要做的是另一个基于SOME_FILE的PHP常量define(),它将指向文件的实际URL(文档根路径被剥离)。

我知道我可以__FILE__$_SERVER['SCRIPT_NAME']为此在3-4行代码(SCRIPT_NAME需要按照CGI 1.1规范,但不DOCUMENT_ROOT),strrpossubstr,但我正在寻找一个“一行“在定义语句中使用的解决方案...

我使用PHP 5.1.0+。艾米建议欢迎!

最简单的解决方案可能是为远程URL提供第二套Consts。

define('ROOT_PATH', $_SERVER['DOCUMENT_ROOT']); 
define('ROOT_URL', 'http://domain.com'); 
define('BLAH_PATH', ROOT_PATH . PATH_SEPARATOR . 'blah.php'); 
define('BLAH_URL', ROOT_URL . PATH_SEPERATOR . 'blah.php'); 
+0

是的,这是最简单的,但我不能指望某些客户端环境中的$ _SERVER ['DOCUMENT_ROOT']。 – AlexV 2010-07-30 15:39:21

+0

这有点不相干,我只是简单地把它放在那里,以便于打字。我所做的一点是,当你可以简单地将一个document_root和root_url定义为独立变量时,为什么会把事情弄糟等等。 – 2010-07-30 16:11:56

+0

是的,我知道,但用我的方式,它可以在任何配置中的任何目录中的任何位置工作。用你的方式,当你改变主机或移动文件时,你必须改变const :) – AlexV 2010-07-30 18:43:28

$docRoot = str_ireplace('/', '\\', $_SERVER['DOCUMENT_ROOT']); $f = str_ireplace($docRoot, '', $f); 

确定。所以我欺骗了一下。这是一行,但两个陈述。我可以把它作为一个声明,但它会更难理解。只需在第二个语句中将第一个str_ireplace替换为$ docRoot即可。