在哪里设置PHP $ _SERVER ['DOCUMENT_ROOT'] Trailing Slash?

时间:2012-03-12 18:56:02

标签: php apache ubuntu

有时$_SERVER['DOCUMENT_ROOT']返回斜杠。在其他环境中它没有。在哪里可以指定?

7 个答案:

答案 0 :(得分:11)

如果$_SERVER['DOCUMENT_ROOT']最后包含斜杠,则不能提前说明。

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

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

在任何情况下,它都包含DocumentRoot directive的值 - 有或没有尾部斜杠,就像它已写入httpd配置文件一样。 PHP只接管来自apache的值。要获取真实的文档根目录,请在配置文件或PHP代码中使用realpath和/或有条件地在末尾添加斜杠(或删除它)。

答案 1 :(得分:4)

我倾向于使用当前目录而不是使用docroot,因为它在命令行和单元测试中也能很好地工作。我倾向于使用类似的东西:

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

而不是:

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

我首先在Wordpress源码中看到它并且非常喜欢它,但它可能导致很多'../'重复。

P.S。 FILE 是当前文件,dirname将从末尾剥离/something.php,因此保留包含当前文件的目录路径。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

我认为这取决于服务器配置,如果使用或不使用拖尾斜杠定义Web根目录。只需检查每个系统是否相同。

另请参阅apache文档的ServerRoot-Directive

答案 4 :(得分:0)

Hakre的回答是正确的。我尝试在不同的情况下,在控制台脚本或Web服务器上使用include。我最好的选择是使用绝对路径,从DOCUMENT_ROOT开始。 但是由于那个尾随的斜线,我仍然被卡住了。 这似乎是一个很好的解决方案:

include_once getenv (“DOCUMENT_ROOT”)。“ ./ WEB-INF / classes

然后从批处理脚本中使用php test.php调用您的脚本,并将值放入DOCUMENT_ROOT env变量,是否带有斜杠或不带斜杠。 从apache加载时,getenv已经填满。

php引擎可以使用././进行管理,并将其称为./。以同样的方式,htdocs./被解释为具有htdocs /(在windows下)

答案 5 :(得分:0)

老问题,我知道,但因为它让我知道如何为自己解决这个问题,我只想在这里添加我的解决方案。我想用$ _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']));
和平,莫

答案 6 :(得分:0)

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

但这不是一个好的决定,因为不同的托管人不同地对待这个参数,所以你的应用程序不应该依赖它,必须在没有帮助的情况下确定是否存在了斜线斜杠。