PHP-IIS 上的 DOCUMENT ROOT 变量

Posted

技术标签:

【中文标题】PHP-IIS 上的 DOCUMENT ROOT 变量【英文标题】:DOCUMENT ROOT variable on PHP-IIS 【发布时间】:2011-06-02 10:44:18 【问题描述】:

$_SERVER["DOCUMENT_ROOT"] 变量是否存在于运行 php 的 IIS 上?之前我认为这个变量是 Apache 特定的,并且在 IIS 上,您必须通过对 SCRIPT_NAMESCRIPT_FILENAME 变量的字符串操作来模拟它,但现在我在 IIS 上的 PHP 安装中看到了这个变量。假设此变量在 IIS 上始终可用是否安全。

【问题讨论】:

【参考方案1】:

IIS 并不总是设置 $_SERVER['DOCUMENT_ROOT']

您如何在配置文件中设置它,以便您的其余代码像在 Apache 服务器上一样工作?

输出 $_SERVER 以查看您可以使用的 IS:

echo "<br>_SERVER:<br><pre>";
print_r($_SERVER);
echo "</pre><br><br>_ENV:<br><pre>";
print_r($_ENV);
echo "</pre><br><br>";

在这种情况下,设置了 SCRIPT_FILENAME 和 SCRIPT_NAME。

修改下面的代码以使用给定的内容来获取 DOCUMENT_ROOT:

if (!isset($_SERVER['DOCUMENT_ROOT']) || $_SERVER['DOCUMENT_ROOT'] === '') 
    $_SERVER['DOCUMENT_ROOT'] = substr($_SERVER['SCRIPT_FILENAME'], 0, -strlen($_SERVER['SCRIPT_NAME']));
    putenv('DOCUMENT_ROOT='.$_SERVER['DOCUMENT_ROOT']);

现在你可以正常使用$_SERVER['DOCUMENT_ROOT']了:

$docroot = getenv("DOCUMENT_ROOT"); 
include_once "$docroot/folder/yourfile.php"; 

【讨论】:

【参考方案2】:

假设文档根目录在 IIS 中始终可用是否安全?没有……

$_SERVER['DOCUMENT_ROOT'] 在 IIS 上并不总是可用。它必须在配置文件中设置...

如果它是在您的服务器上配置的,您“可以”使用它...只要确保您的配置文件不会更改 - 否则您会破坏您的脚本...

【讨论】:

配置文件 = php.ini 还是别的什么? 我知道在 php.ini 中你可以设置 doc_root(它在路径部分下)...但这会设置全局 doc_root... 刚刚进行了谷歌搜索:forums.iis.net/p/1154314/1932457.aspx 是对 doc_root 和多个站点的一些问题的概述......在底部,它引用了一些阅读链接......如果你只有一个网站不是问题... 三分之二的 IIS 服务器显示 $_SERVER["DOCUMENT_ROOT"]。这 2 个中的 1 个也显示 $_ENV["DOCUMENT_ROOT"]。所以是的,似乎它不总是可用。 这个变量并不总是出现在 IIS 上是什么意思?它取决于什么?我在通过任务计划程序运行一些“cron”任务时遇到了类似的问题,php-cgi.exe - 但是当只是通过普通浏览器浏览网站时,我发现$_SERVER['DOCUMENT_ROOT'] DOES 存在(至少作为在我尝试过的许多情况下)。另一个有趣的现象:我正在使用 Xdebug,因为它以易于理解的彩色格式转储变量,但是当多次按下 F5 时,Xdebug 着色有时似乎不起作用 - 有点像它没有加载完全没有。为什么?【参考方案3】:

我通过简单地引用我的网络根目录并将其设置为我自己的变量之一来解决它。

<?php
echo getcwd();
chdir('/');
echo getcwd();
chdir('/example-web-server');
echo getcwd();
?>

以下代码获取 PHP 的当前工作目录,该目录将包含您正在运行的文件的目录。 chdir('/') 指向 PHP 可以操作的任何地方的根,在我的例子中是 C:\。我的示例 Web 服务器的 Web 根目录位于 C:\example-web-server,因此您可以像这样在 PHP 中引用它: /example-web-server

一旦获得 PHP 的路径,就可以将其设置为变量并调用它。我将使用include()C:\example-web-server\testing\index.php 的示例:

<?php
$webroot = "/example-web-server";
include("$webroot/testing/index.php");
?>

我知道这是一个旧线程,但我不能是唯一需要解决此问题的人。

【讨论】:

【参考方案4】:

这是我在 index.php 之上所做的:

if(!isset($_SERVER["DOCUMENT_ROOT"]))

    $_SERVER["DOCUMENT_ROOT"]=getcwd();

【讨论】:

以上是关于PHP-IIS 上的 DOCUMENT ROOT 变量的主要内容,如果未能解决你的问题,请参考以下文章

如何限制 PHP 对 DOCUMENT_ROOT 的文件访问

在摆弄公共树时修复 DOCUMENT_ROOT

如何禁用Document root的创建

没有附件的正文上的phpMailer图像

javascriptDOM节点

如何在 OSX 中使用 Dropbox 目录作为虚拟主机 Document Root?