使用Apache时,PHP中DOCUMENT_ROOTvariables的斜线不一致

在不同的服务器环境中,PHP $_SERVER['DOCUMENT_ROOT']超级全局有时会有斜线,有时不会。 我原以为这个问题直接关系到Apache DocumentRoothttpd.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 /

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

任何想法为什么发生这种情况 有没有我错过的configuration参数?


以供参考:

  • RHEL的PHP​​ 5.3.3(问题发生): PHP 5.3.3(cli)(内置:2010年7月23日16:26:53)
  • Ubuntu的PHP版本(没问题): 带有Suhosin-Patch(cli)的PHP 5.3.2-1ubuntu4.2(内置:2010年5月13日20:03:45)

我不知道为什么你的虚拟主机之间的斜线正在改变。 顺便说一下,重要吗? 只需要添加一个新的斜杠到你的程序(删除如果双斜杠存在),问题就解决了。

我用

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

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

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

我build议你去检查虚拟主机configuration下的vhosts.dsites-available目录。

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

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

build议的解决scheme:

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

在所有的安装中都不起作用。

例如,在我的情况下:

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

和以前一样的问题。

可能你应该修改第一条指令:

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