在哪里设置PHP$_SERVER[';DOCUMENT_ROOT';]拖尾斜线


Where to set PHP $_SERVER['DOCUMENT_ROOT'] Trailing Slash?

有时$_SERVER['DOCUMENT_ROOT']返回时带有尾部斜杠。在其他环境中则不然。在哪里可以指定?

如果$_SERVER['DOCUMENT_ROOT']的末尾是否包含斜杠,则不能提前告知。

通常,如果配置正确,则不会包含尾部斜杠。在Ubuntu(以及其他UNIX)上,正确编写的目录路径末尾没有/。例如,在windows上,如果配置了apache,它甚至会拒绝启动。在UNIX上,Apache没有那么挑剔,并且允许使用尾部斜杠。

但是有一个例外,如果您将根目录(/)作为文档根目录。由于这种情况,您不能提前说明它是否包含尾部斜杠。

在任何情况下,它都包含DocumentRoot指令的值——带有或不带有尾部斜杠,就像它被写入httpd配置文件一样。PHP只接收来自apache的值。要获得真正的文档根,请使用realpath和/或在配置文件或PHP代码中有条件地在末尾添加斜线(或删除它)。

比起使用docroot,我更倾向于使用当前目录,因为它在命令行和单元测试中也能很好地工作。我倾向于使用这样的东西:

require_once(dirname(__FILE__).'/../../../../constants.php');

而不是:

require_once($_SERVER['DOCUMENT_ROOT'].'/../constants.php');

我第一次在Wordpress源代码中看到它,很喜欢它,但它会导致很多"../"重复

p.S.FILE是当前文件,dirname将从末尾去掉/homething.php,从而留下包含当前文件的目录的路径。

您可以这样做,以确保尾部斜杠始终存在

'/'.trim($_SERVER['DOCUMENT_ROOT'],'/')。'/'

require_once( '/'.trim( $_SERVER['DOCUMENT_ROOT'], '/' ).'/'.'constants.php' );

我认为这取决于服务器配置,如果定义web根时使用或不使用尾部斜杠。只需检查一下,这在每个系统上都是平等的。

另请参阅apache文档的ServerRoot指令。

Hakre的答案是正确的。我尝试在不同的情况下,在控制台脚本或web服务器上使用include。我的最佳选择是使用绝对路径,从DOCUMENT_ROOT开始。但我还是因为后面的斜线而被卡住了。这似乎是一个很好的解决方案:

include_onegetenv("DOCUMENT_ROOT")。"./WEB-INF/classes

然后使用批处理脚本中的php-test.php调用脚本,并在DOCUMENT_ROOT env变量中输入一个值,无论是否带有尾部斜杠。从apache加载时,getenv已填充。

php引擎可以使用././进行管理,告诉它和./一样。以同样的方式htdocs/被解释为具有htdocs/(在windows下)

我知道这个老问题,但既然它让我知道了如何自己解决这个问题,我就在这里添加我的解决方案。我想用$_SERVER['DOCUMENT_ROOT']定义一个常量(ROOTPATH),并确保它有一个尾部斜杠(DIRECTORY_SEPARATOR)。

define('ROOTPATH', (ctype_alnum(substr($_SERVER['DOCUMENT_ROOT'], -1)) ? $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR : $_SERVER['DOCUMENT_ROOT']));

这假设文件夹名称的最后一个字符是字母数字(我不记得看到过很多以特殊字符结尾的文件夹名称)。如果你想确保没有拖尾斜线,你可以选择这样的东西:

define('ROOTPATH', (!ctype_alnum(substr($_SERVER['DOCUMENT_ROOT'], -1)) ? substr($_SERVER['DOCUMENT_ROOT'], 0, -1) : $_SERVER['DOCUMENT_ROOT']));

和平,Mo

使用虚拟主机时,Apache将虚拟主机的DocumentRoot的值写入$_SERVER['DOCUMENT_ROOT']。所以你可以在那里写斜线。

但这不是一个好的决定,因为不同的宿主对这个参数的处理方式不同,所以你的应用程序不应该依赖它,必须在没有帮助的情况下确定是否存在trailing slash。