【发布时间】: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