使用 Apache 时 PHP 中 DOCUMENT_ROOT 变量的尾部斜杠不一致

使用 Apache 时 PHP 中 DOCUMENT_ROOT 变量的尾部斜杠不一致

在不同的服务器环境中,PHP$_SERVER['DOCUMENT_ROOT']超级全局变量有时带有尾部斜杠,有时则没有。我原以为这个问题与 ApacheDocumentRoot在文件中的定义方式直接相关httpd.conf

即我会认为,如果httpd.conf不包含尾部斜杠:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current
    ...

然后echo $_SERVER['DOCUMENT_ROOT']应该给予/var/www/live/current

如果httpd.conf确实包含尾部斜杠:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current/
    ...

然后echo $_SERVER['DOCUMENT_ROOT']应该给予/var/www/live/current/

$_SERVER['DOCUMENT_ROOT']在 Ubuntu 10.04 上就是这种情况,但在 RHEL 5.5 上,即使 Apache 上没有定义,也会添加尾随斜杠。

知道为什么会发生这种情况吗?我是否缺少配置参数?


以供参考:

  • RHEL 的 PHP 5.3.3(出现问题):PHP 5.3.3 (cli)(构建于:2010 年 7 月 23 日 16:26:53)
  • Ubuntu 的 PHP 版本(没有问题):PHP 5.3.2-1ubuntu4.2 带有 Suhosin-Patch (cli)(构建于:2010 年 5 月 13 日 20:03:45)

答案1

我不知道为什么您的虚拟主机之间的斜线会发生变化。顺便问一下,这重要吗?只需在程序中添加一个新斜线(如果存在双斜线,则删除),问题就解决了。

我用

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

答案2

http://httpd.apache.org/docs/2.0/mod/core.html说:应指定不带尾部斜杠的 DocumentRoot。

答案3

Apache 环境中的文档根目录可以在多个地方定义。

是的,httpd.conf包含这些设置,但它们可以被覆盖,因为此文件用于默认配置。

我建议您去检查vhosts.dsites-available目录下的 vhost 配置。

答案4

Dom 的答案是这个问题的解决方案,但是 stefanvesca 的陈述是您在不同的环境中遇到双重“//”的原因。在本地计算机上,在您设置虚拟主机的 .conf 文件中,您很可能在定义的文档根目录末尾添加了 /,而设置其他环境的人没有,反之亦然。

无论如何,当使用 php 的 $_SERVER['DOCUMENT_ROOT'] 时,您将获得 apache 环境值,这是配置的结果。这就是一个环境中使用 '/' 而另一个环境中使用 '//' 的原因。

相关内容