为什么 web.config IsFile 条件导致错误 500

Why does web.config IsFile condition cause error 500

我正在从事共享托管服务 运行 IIS 10.0。在此服务器上有以下目录结构:

CommonRoot
|
+- MyRoot
   |
   +- WebSite1
   +- WebSite2
   \- Shared

我没有对 CommonRoot 目录的任何访问权限(如预期的那样)。我有权访问的第一个目录是目录 MyRoot。

现在我想在我的 web.config 中为 WebSite1 重写规则如下:

<rule name="MyRule">
    <match url="^.*$" />
    <conditions>
        <add input="CommonRoot\MyRoot\Shared\foo" matchType="IsFile" />
    </conditions>
    <action type="Rewrite" url="/foo.html" />
</rule>

但是这个配置会报错500。当我打开了详细的日志记录时,生成的页面并没有给出任何实际错误的反馈。

现在,当我将条件更改为以下内容时:

<add input="CommonRoot\MyRoot\WebSite1\foo" matchType="IsFile" />

条件突然生效。

由于我没有对 CommonRoot 文件夹的任何访问权限,我怀疑条件检查以某种方式检查 Web 应用程序是否可以访问任何文件夹,从当前应用程序文件夹开始倒数。由于我使用的是共享托管服务,因此(出于显而易见的原因)也不允许我在 CommonRoot 文件夹上设置权限。如果我提出要求,我肯定不会被授予任何权利。这是已知的限制吗?

有趣的是,当我在同一台服务器上使用 Perl 脚本时,我可以检查文件 CommonRoot\MyRoot\Shared\foo 是否存在,甚至可以读取内容。所以 IIS 正在检查文件是否与 Perl 解释器不同。

更新: 另一个奇怪的是,当文件根本不存在时,原始条件不会导致错误。只有当文件实际存在时,才返回错误500。

最后才知道原来都是配股。分配给 IIS 服务器 (NT AUTHORITY\NETWORK SERVICE) 的用户需要能够访问规则中正在检查的目录(和文件),否则检查将失败。 如果该用户没有读取目录的权限,当文件存在时,IIS 将 return 向客户端发送错误 500。