如何在 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
我一直在使用 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