我们的一个基于经典ASP.NET技术的遗留网站已迁移到新托管。现在它是运行Windows Azure Pack的云,我们的站点在.NET Framework 4.6.1下运行。
但是,我仍然无法为具有正确HTTP状态404的不存在的.aspx资源返回自定义错误页面 - 状态始终为302.最初,自定义404错误页面在web.config中定义如下:
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/error/server-error.aspx">
<error statusCode="404" redirect="/error/resource-not-found.aspx"/>
</customErrors>
</system.web>
我确实阅读了this之类的SO帖子并尝试了建议的答案,包括将redirectMode设置为ResponseRewrite,但没有任何帮助或没有按预期工作。
我错过了什么,还是有其他解决方案?
答案 0 :(得分:1)
但是,我仍然无法为具有正确HTTP状态404的不存在的.aspx资源返回自定义错误页面 - 状态始终为302.
据我所知,HTTP 302表示请求的资源已移至其他位置。根据您的描述,我创建了一个ASP.NET Web应用程序,并使用您提供的自定义错误配置将其部署到Azure Web App。
这是我的详细测试:
关闭CustomErrors的模式
如果找不到您请求的资源,那么您可以通过浏览器中的Fiddler或开发者工具获得如下的响应标题。
将CustomErrors的模式设置为RemoteOnly
使用您提供的配置,当找不到所请求的资源时,您可以按如下方式获取详细信息:
经过测试,我已经在我的身边和Azure Web App上成功测试过。 当您通过Fiddler获得302响应时,请尝试检查位置标题。此外,如果您希望在找不到资源并且浏览器将重定向到包含404状态代码的resource-not-found.aspx页面时,您可以遵循此相关thread。
答案 1 :(得分:1)
我设法克服了这个问题。首先,我关闭了web.config中错误404的重定向:
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/error/server-error.aspx">
<!-- <error statusCode="404" redirect="/error/resource-not-found.aspx"/> -->
</customErrors>
</system.web>
然后我将以下Application_Error事件处理程序添加到我的Global.asax:
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim serverError As HttpException = DirectCast(Server.GetLastError(), HttpException)
If Not serverError Is Nothing Then
If 404 = serverError.GetHttpCode() Then
Server.ClearError()
Server.Transfer("/error/resource-not-found.aspx")
End If
End If
End Sub
最后,我将下面的行添加到我的错误404. page(resource-not-found.aspx):
Sub Page_Load()
' If you're running under IIS 7 in Integrated mode set,
' use this line to override IIS errors:
Response.TrySkipIisCustomErrors = True
Response.StatusCode = 404
Response.StatusDescription = "Page not found"
End Sub
仅供参考:如果您使用MasterPage技术,则只会重定向MasterPage的可变部分。在我们网站的各个部分中使用不存在的资源后,我发现这种行为对我们的最终用户来说很聪明且有用。
还有一件事。要返回非ASPX资源的HTTP 404状态代码,我在web.config中使用以下设置:
<system.webServer>
<httpErrors errorMode="Custom" defaultResponseMode="Redirect">
<remove statusCode="404"/>
<error statusCode="404" path="/error/resource-not-found.aspx" responseMode="ExecuteURL"/>
</httpErrors>
</system.webServer>
请注意针对错误404设置为'ExecuteURL'的responseMode。
答案 2 :(得分:0)
我没有用.aspx做过很多 我只是在谷歌上搜索,我想知道你是否有
<% Response.StatusCode = 404 %>
你在404.aspx页面上的?