【问题标题】:Why does web.config IsFile condition cause error 500为什么 web.config IsFile 条件会导致错误 500
【发布时间】:2021-12-18 04:46:13
【问题描述】:

我正在开发运行 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。

【问题讨论】:

  • 建议你使用failed request tracking查看500的详细错误信息。
  • @samwu 要启用 FRT,我需要访问 IIS 管理器或 applicationhost.config 文件。我在共享托管服务上,无权访问这些。在我的本地测试环境中,一切正常,但在实际的共享托管服务器上却不行。
  • 如果不能使用frt,你的问题很难排查。

标签: iis url-rewriting web-config


【解决方案1】:

最后我发现这确实是一个配股问题。分配给 IIS 服务器 (NT AUTHORITY\NETWORK SERVICE) 的用户需要有权访问规则中正在检查的目录(和文件),否则检查将失败。 如果该用户无权读取目录,则当文件存在时,IIS 将向客户端返回错误 500。

【讨论】:

  • 我很高兴问题已经解决。如果您可以将解决方案标记为答案,我们将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2012-03-29
  • 1970-01-01
  • 2023-04-09
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多