问题描述
我希望所有缺少的内容/“不良” 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
时,它必须在项目中包含代码才能在服务器端处理400
和500
。
由于您的项目只是静态Web应用程序,并且没有服务器端代码。因此,我建议您可以在httpErrors
中使用硬代码。
就像
<error statusCode="404" responseMode="ExecuteURL" path="/404.html?httpcode=404" />
。
httpErrors
的标记在诸如iis
的服务器中使用。您想要的404
和500
错误无法直接在浏览器中显示。因为使用了httpErrors
标签,服务器将处理所有内容并将其返回给浏览器,因此您获得的HttpStaus始终为200
。
重要
我可能知道您的问题。您的程序是.net framework
或.net core
,目前尚不清楚。但是我在web.config
文件中看到了配置标记。
原则上,错误的请求到达IIS
和其他服务器,并且代码级已处理404
和其他错误,因此返回的HttpStatus
值必须为{{1} }。无法更改它,但是当发生200
或404
错误时,我们可以在500
中进行处理和记录也可以达到您要分析的目的。
因此我进行了测试,并基于Application_Error
,您可以download my sample code on github并给出以下建议。
1。将.net framework
方法添加到Global.asax.cs文件中。
2。根据{{1}}方法,添加一个Application_Error
控制器。
3。执行测试,结果显示在屏幕截图中。
解码消息后。内容是
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"];