如何在 IIS 服务器上获得有效的 DOCUMENT_ROOT 值?

How to get a working DOCUMENT_ROOT value on IIS server?

我一直在使用 Linux 服务器,我认为我的开发时间占了 98%。我或多或少是第一次将代码放到某些 IIS 服务器上。

我在 Linux Env 上工作,所以一切都按我预期的那样工作,但是进入 IIS 服务器后一切都崩溃了。我会避免大家大声抱怨为什么 IIS 和 Windows 很糟糕,然后解决手头的问题。

在我的环境中使用 $_SERVER['DOCUMENT_ROOT'] 输出如下值:

/var/www/project

哪个适合包含文件,例如

require_once $_SERVER['DOCUMENT_ROOT']. '/app/connect.php';

但是,在 IIS 上,此错误消息为:

No such file or directory

这让我在代码前加上这个:

echo '<pre>'. print_r($_SERVER['DOCUMENT_ROOT'], 1) .'</pre>';

输出这个:

C:\inetpub\wwwroot

100% 与实际站点无关。

是否应该使用特定于 IIS 的变量来包含我的脚本?当包含根本不理想的文件时,它似乎对我的所有代码产生了巨大的连锁反应。在理想世界中,我的代码不会用 10 英尺长的杆子接触 IIS,但不幸的是它必须 运行 在上面。

如何在我的代码中设置站点的根目录?

对我来说不幸的是,IIS 服务器不在我的控制之下,所以我无法真正寻求篡改服务器设置的解决方案。但是我确实设法找到了解决方案:

我放在我的 header.php 模板文件中:

echo '<pre>'. print_r(exec('CHDIR'), 1) .'</pre>';

这给了我一个看起来像这样的值:

C:\www\mysite

这与 $_SERVER['DOCUMENT_ROOT'] 的输出有很大不同。

我创建了一个条件来区分服务器 OS 并根据值设置一个新变量:

if (strpos(PHP_OS, 'Linux') > -1) {
    $root = $_SERVER['DOCUMENT_ROOT'];
    $feRoot = '/';
} else {
    $root = 'C:\www\mysite';
    $feRoot = 'http://mysite';
}

现在我可以这样调用我的脚本 ($DS = DIRECTORY_SEPRARTOR):

require_once $root. $DS .'app'. $DS .'connect.php';

然后这样调用我的前端资产:

<link rel="stylesheet" href="<?php echo $feRoot; ?>/css/file.css" />

所以 IIS 的关键是处理绝对值而不是相对于 DOCUMENT_ROOT