在Azure App Service IIS上使用responseMode executeURL使用httpErrors自定义404错误时需要保留HTTP状态代码

问题描述

我希望所有缺少的内容/“不良” 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
  • 允许使用服务器端的include来使用我们当前的Perl设置更新页眉/页脚元素

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

<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服务器可以处理这种情况...

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

解决方法

更新

在web.config中使用httpErrors时,它必须在项目中包含代码才能在服务器端处理400500

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

就像

<error statusCode="404" responseMode="ExecuteURL" path="/404.html?httpcode=404" />

httpErrors的标记在诸如iis的服务器中使用。您想要的404500错误无法直接在浏览器中显示。因为使用了httpErrors标签,服务器将处理所有内容并将其返回给浏览器,因此您获得的HttpStaus始终为200

重要

我可能知道您的问题。您的程序是.net framework.net core,目前尚不清楚。但是我在web.config文件中看到了配置标记。

原则上,错误的请求到达IIS和其他服务器,并且代码级已处理404和其他错误,因此返回的HttpStatus值必须为{{1} }。无法更改它,但是当发生200404错误时,我们可以在500中进行处理和记录也可以达到您要分析的目的。

因此我进行了测试,并基于Application_Error,您可以download my sample code on github并给出以下建议。

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

enter image description here

2。根据{{​​1}}方法,添加一个Application_Error控制器。

enter image description here

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

enter image description here

解码消息后。内容是

Application_Error

我们可以在Error函数中自定义错误消息。我们可以附加The controller for path '/a/b' was not found or does not implement IController.和其他信息。

,

嗨,我找到了这个解决方法(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"];