【问题标题】:Need to preserve HTTP status code when using httpErrors custom 404 error using responseMode executeURL on Azure App Service IIS在 Azure 应用服务 IIS 上使用 responseMode executeURL 使用 httpErrors 自定义 404 错误时需要保留 HTTP 状态代码
【发布时间】:2020-08-25 14:48:17
【问题描述】:

我想让所有缺少的内容/“错误”URL 重定向到我们的自定义 404.html 错误页面。 这对于在 Google Analytics 中准确记录 404 错误非常重要。

问题在于,当设置了 responseMode=ExecuteURL 标志时,自定义错误不会保留 404 状态代码,而是始终显示 200 代码。我可以将其更改为 responseMode=Redirect,但这会在重定向到自定义 404.html 页面之前显示 302 状态代码。

所有这些 DOES 都可以使用在 httpError 上设置的“文件”标志......只是不使用我们的服务器端 Perl 所需的“ExecuteURL”标志,包括用于呈现页眉/页脚页面元素。

理想情况下,我们应该能够使用 Azure App Service IIS web.config 将自定义错误设置为:

  • 始终在地址栏(和开发工具)中保留/显示请求的(缺失的)URL 请求
  • 始终在开发工具中保留/显示“真实”HTTP 状态代码 (404)
  • 允许使用服务器端包含使用我们当前的 Perl 设置更新页眉/页脚元素

以下代码用于在地址栏中保留请求的 URL,正确显示带有服务器端页眉/页脚内容的自定义 404.html 页面,但是在开发工具中丢失了 404 状态代码(和谷歌分析)...

<httpErrors>
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" 
          responseMode="ExecuteURL" 
          path="/404.html" />
</httpErrors>

更改为 responseMode="Redirect" 只会将状态码更改为 302,然后再重定向到自定义 404.html...

如果我改为使用 responseMode="File" 这一切正常,但我会丢失使用 Perl 服务器端包含处理的自定义服务器端页眉和页脚...

编辑: 需要明确的是,自定义 404 页面都是 HTML 和 Javascript,但利用了一些 非常 旧的 Perl 服务器端包含来向页面添加自定义页眉和页脚元素。我们没有使用任何 .NET 框架或 .NET 核心页面...

这种安排应该是可能的,但也许只能使用不同的 Web 服务器,而不是 IIS?也许是 nginx?

最终更新: 不是一个完整的答案,但我们近期的解决方案是使用 nginx 代理配置(已经存在并且可以在 nginx.conf 中更改)来保留 404 错误代码并显示正确的自定义 404.html 静态文件。

我也可以用 Docker 和 nginx 做到这一点,所以我知道 Web 服务器可以处理这种情况......

我已经确定 AFAICT 没有办法让 IIS web.config 不使用 Jason Pan 建议的服务器端代码来处理这个问题。因此,尽管他可能是正确的,但该答案对我们的需求没有帮助。

【问题讨论】:

    标签: perl iis web-config azure-web-app-service http-status-code-404


    【解决方案1】:

    更新

    当您在 web.config 中使用 httpErrors 时,它必须在您的项目中有代码来处理服务器端的 400500

    由于您的项目只是静态 Web 应用程序,没有服务器端代码。所以我建议你可以在httpErrors中使用硬编码。

    喜欢,

    &lt;error statusCode="404" responseMode="ExecuteURL" path="/404.html?httpcode=404" /&gt;.

    httpErrors的标签用于iis等服务器。您想要的404500 错误无法直接显示在浏览器中。因为使用了httpErrors标签,所以服务器会处理一切,返回给浏览器,所以你得到的HttpStaus永远是200

    私人

    我可能知道你的问题。你的程序是.net framework还是.net core,暂时不清楚。但我在web.config 文件中看到了配置标签。

    原则上错误请求到达IIS等服务器,代码层面已经处理了404等错误,所以返回的HttpStatus值一定是200。没办法改,但是当出现404或者500错误时,我们可以在Application_Error中处理和记录,也可以达到你要分析的目的。

    所以我测试了一下,基于.net framework,大家可以download my sample code on github给出以下建议。

    1.将Application_Error 方法添加到 Global.asax.cs 文件中。

    2。按照Application_Error的方法,添加一个ErrorController。

    3.执行测试,结果显示在屏幕截图中。

    解码后的消息。内容是

    The controller for path '/a/b' was not found or does not implement IController..

    我们可以在Application_Error 函数中自定义错误消息。我们可以附加HttpCode 和其他信息。

    【讨论】:

    • 也许我应该更清楚这个问题?我们实际上并没有在此应用程序中使用 .NET 框架或 .NET 核心...我们正在使用 IIS 作为 Web 服务器,并且应用程序作为 Azure 应用程序托管服务。但是应用程序本身都是 JavaScript,添加了一些 非常 旧的 Perl 服务器端包含,用于添加自定义页眉和页脚元素。
    • @Andrew 什么意思?我的解决思路应该没问题。你的项目结构是什么样的?网络表单?
    • 我真的不想将自定义 404 页面重写为 .NET .aspx 页面。这是一个大部分静态网站,其中包含一些旧版 Perl 以呈现页眉和页脚。直接引用时,自定义 404 页面呈现良好。只有在自定义处理程序(带有 ExecuteURL 标志)的上下文中,才不会保留状态代码。是的,如果我们将自定义 404 页面重写为 .NET 页面,并重写该页面中返回的状态代码,我们也许可以使用 IIS。我希望避免这种情况。
    • @Andrew 现在,您的 peoject 可以运行良好,为了尽量减少对代码的更改,建议对 url 链接附加 HttpStatus 值进行硬编码。喜欢path="/404.html?httpcode=404"
    【解决方案2】:

    您好,我找到了这个解决方法(ASP NET WebForms)

    网页配置

    <httpErrors errorMode="Custom" existingResponse="Replace">
          <remove statusCode="404" subStatusCode="-1" />
          <error statusCode="404" path="/ErrorDefault.aspx?httpcode=404" responseMode="ExecuteURL" />
          <remove statusCode="500" subStatusCode="-1" />
          <error statusCode="500" path="/ErrorDefault.aspx?httpcode=500" responseMode="ExecuteURL" />
    </httpErrors>
    

    ErrorDefault.cs > 页面加载

    var httpCode = Request.QueryString["httpcode"];
    

    【讨论】:

      猜你喜欢
      • 2016-04-14
      • 2014-08-01
      • 2015-02-15
      • 2014-05-25
      • 1970-01-01
      • 2023-03-21
      • 2021-12-02
      • 2021-10-21
      • 2012-10-06
      相关资源
      最近更新 更多