【问题标题】:IIS 7.5 = Nested web.config will not override custom error handling set in application level web.configIIS 7.5 = 嵌套 web.config 不会覆盖应用程序级别 web.config 中设置的自定义错误处理
【发布时间】:2016-06-22 14:42:13
【问题描述】:

运行 ColdFusion 11(更新 7)和 IIS 7.5

我的站点应用程序/根级别 web.config:

<configuration>
    <system.webServer>
        <httpErrors errorMode="Custom" />
    </system.webServer>
</configuration>

我的嵌套 web.config 文件,位于 /api/eb 内:

<configuration>
    <system.webServer>
        <httpErrors errorMode="Detailed" />
    </system.webServer>
</configuration>

当我访问位于 /api/eb 子目录中的页面(例如 401.cfm)并触发 401 状态代码时,服务器将返回自定义错误处理程序响应。我对文档的解释是嵌套的 web.config 文件应该覆盖根 web.config 文件,但显然不是。

我检查了 IIS 应用程序主机文件,并且 httpErrors overrideModeDefault 设置为 true。我还尝试在我的根 web.config 文件中使用位置标记来执行相同的操作,但除非我将路径设置为通配符,否则它也会被忽略。

我没有想法。对你的帮助表示感谢。提前谢谢你。

【问题讨论】:

    标签: iis coldfusion


    【解决方案1】:

    我发现这篇文章似乎很好地解释了你的问题 - How to Use HTTP Detailed Errors in IIS 7.0

    特别是这段摘录:

    安全注意事项

    请注意:出于架构原因,如果 URL 位于同一应用程序池中,IIS 只能执行该 URL。使用重定向功能在不同的应用程序池中执行自定义错误。

    当发生特定错误时,IIS 还可以向浏览器返回 302 重定向。如果您有服务器场,则重定向很好。例如,您可以将所有错误重定向到您密切监控的中心位置。

    但是存在风险:responseMode="File"(这是默认设置)允许您指定磁盘上的每个文件。如果您非常注重安全,这将不起作用。

    一个可行的方案可能包括只允许 errorMode 设置的委派。这使开发人员即使在使用远程客户端也能接收其应用程序的详细错误。只需设置errorMode="Detailed"。以下是如何配置此方案:

    允许 httpErrors 部分的委托:

    &lt;section name="httpErrors" overrideModeDefault="Allow" /&gt;

    其次,转到 applicationHost.config 中的部分并更改它,以便仅委托 errorMode:

    &lt;httpErrors lockAllAttributesExcept="errorMode" lockElements="error"&gt;
    &lt;error statusCode="404" prefixLanguageFilePath="E:\inetpub\custerr" path="404.htm" /&gt; &lt;error statusCode="401" prefixLanguageFilePath="E:\inetpub\custerr" path="401.htm" /&gt; &lt;error statusCode="403" prefixLanguageFilePath="E:\inetpub\custerr" path="403.htm" /&gt; &lt;error statusCode="405" prefixLanguageFilePath="E:\inetpub\custerr" path="405.htm" /&gt; &lt;error statusCode="406" prefixLanguageFilePath="E:\inetpub\custerr" path="406.htm" /&gt; &lt;error statusCode="412" prefixLanguageFilePath="E:\inetpub\custerr" path="412.htm" /&gt; &lt;error statusCode="500" prefixLanguageFilePath="E:\inetpub\custerr" path="500.htm" /&gt; &lt;error statusCode="501" prefixLanguageFilePath="E:\inetpub\custerr" path="501.htm" /&gt; &lt;error statusCode="502" prefixLanguageFilePath="E:\inetpub\custerr" path="502.htm" /&gt;

    &lt;/httpErrors&gt;

    请注意,overrideModeDefault 属性的正确值是 Allow,而不是您在问题中提到的 true

    本文进一步解释了overrideModeDefault 属性-Understanding IIS 7.0 Configuration Delegation

    摘录:

    overrideModeDefault 属性是一个可选属性,它定义了一个部分的锁定状态。其可用值为 Allow 或 Deny。默认值为“允许”。与服务器的任何性能、安全或关键方面相关的所有 IIS 部分都被锁定,此属性设置为“拒绝”。如果 overrideModeDefault 属性设置为“拒绝”,则任何为特定配置部分的属性设置值的较低级别的配置文件(即 web.config 文件)都无法生效并覆盖全局值。这会导致锁冲突并发生错误。

    【讨论】:

    • 仔细检查我可以看到我确实将 overrideModeDefault 设置为允许
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多