地带文档根
问题描述:
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),strrpos
和substr
,但我正在寻找一个“一行“在定义语句中使用的解决方案...
我使用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');
答
$docRoot = str_ireplace('/', '\\', $_SERVER['DOCUMENT_ROOT']); $f = str_ireplace($docRoot, '', $f);
确定。所以我欺骗了一下。这是一行,但两个陈述。我可以把它作为一个声明,但它会更难理解。只需在第二个语句中将第一个str_ireplace替换为$ docRoot即可。
是的,这是最简单的,但我不能指望某些客户端环境中的$ _SERVER ['DOCUMENT_ROOT']。 – AlexV 2010-07-30 15:39:21
这有点不相干,我只是简单地把它放在那里,以便于打字。我所做的一点是,当你可以简单地将一个document_root和root_url定义为独立变量时,为什么会把事情弄糟等等。 – 2010-07-30 16:11:56
是的,我知道,但用我的方式,它可以在任何配置中的任何目录中的任何位置工作。用你的方式,当你改变主机或移动文件时,你必须改变const :) – AlexV 2010-07-30 18:43:28