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


10

在不同的服务器环境中,PHP $_SERVER['DOCUMENT_ROOT']super global有时带有斜线,有时没有。我以为这个问题与文件中如何DocumentRoot定义Apache直接相关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 /

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

知道为什么会这样吗?我是否缺少配置参数?


以供参考:

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

Answers:


6

我不知道为什么虚拟主机之间的斜线会改变。顺便说一句,重要吗?只需在程序中添加一个新斜杠(如果存在双斜杠,则删除该斜杠)即可解决问题。

我用

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

4
您可以简单地使用$realpath = realpath($_SERVER['DOCUMENT_ROOT']);。它会自动删除所有多个斜杠以及结尾的斜杠。如果您始终希望将斜杠连接到上述对的调用结果中realpath()。不在里面。
2014年

1
我可以确认Hosteurope主机(Ubuntu我认为)之间存在相同的问题(php 5.5):有斜线...和Windows 7:无斜线(相当新的XAMPP安装)
Frank Nocke

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'应该比realpath可以做的所有事情快一点。
Frank Nocke


3

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

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

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


2

建议的解决方案:

$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'])."/";


1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'应该比realpath可以做的所有事情快一点。
Frank Nocke 2015年

2

Dom的答案是解决此问题的方法,但是stefanvesca的声明是为什么在不同的环境中遇到双'//'的原因。在本地计算机上的.conf文件中,您用于设置虚拟主机的位置,很可能在已定义文档根目录的末尾添加了/,而设置其他环境的人未添加,反之亦然。

无论哪种方式,当使用php的$ _SERVER ['DOCUMENT_ROOT']时,都会得到apache环境值,该值是配置的结果。这就是在一个环境中使用“ /”而在另一个环境中使用“ //”的原因。


1

我想说的是假定DOCUMENT_ROOT不带斜杠。

该值从Web服务器配置传递

阿帕奇

DocumentRoot /var/www/html

这意味着我们应该对添加到它的路径使用引号。

知道路径中任何地方的双斜杠'//'都没有影响(当与HTTP URL中的文件系统相关时,可能会出现一些小故障)

$ cat /etc//issue Debian GNU/Linux 9 \n \l

如果在DOCUMENT_ROOT后面有一个斜杠,我们可以将sysadmin归咎于没有任何后果的东西:)

安全地忽略它吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.