![使用 Apache 时 PHP 中 DOCUMENT_ROOT 变量的尾部斜杠不一致](https://linux22.com/image/522678/%E4%BD%BF%E7%94%A8%20Apache%20%E6%97%B6%20PHP%20%E4%B8%AD%20DOCUMENT_ROOT%20%E5%8F%98%E9%87%8F%E7%9A%84%E5%B0%BE%E9%83%A8%E6%96%9C%E6%9D%A0%E4%B8%8D%E4%B8%80%E8%87%B4.png)
在不同的服务器环境中,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.d
和sites-available
目录下的 vhost 配置。
答案4
Dom 的答案是这个问题的解决方案,但是 stefanvesca 的陈述是您在不同的环境中遇到双重“//”的原因。在本地计算机上,在您设置虚拟主机的 .conf 文件中,您很可能在定义的文档根目录末尾添加了 /,而设置其他环境的人没有,反之亦然。
无论如何,当使用 php 的 $_SERVER['DOCUMENT_ROOT'] 时,您将获得 apache 环境值,这是配置的结果。这就是一个环境中使用 '/' 而另一个环境中使用 '//' 的原因。