【发布时间】:2010-11-19 17:28:46
【问题描述】:
在 ASP.NET 中处理 404 错误时,可以设置 404 错误以重定向到将 404 响应代码发送到浏览器的页面,还是应该使用 server.transfer 以便可以将 404 标头发送到浏览器,同时网址保持不变?
【问题讨论】:
标签: asp.net http-status-code-404
在 ASP.NET 中处理 404 错误时,可以设置 404 错误以重定向到将 404 响应代码发送到浏览器的页面,还是应该使用 server.transfer 以便可以将 404 标头发送到浏览器,同时网址保持不变?
【问题讨论】:
标签: asp.net http-status-code-404
我会使用 web.config 的 customerrors 部分,然后您可以指定您希望 404 转到的页面。
<configuration>
<system.web>
<customErrors mode="On" defaultRedirect="Error.aspx">
<error statusCode="404" redirect="404Error.aspx" />
</customErrors>
</system.web>
</configuration>
如果您仍想在接收页面上发送 404,您可以将其放在 page_load 事件中:
Response.Status = "404 Not Found";
【讨论】:
我的建议是让 ASP.NET 进程根据您的 web.config 为您完成工作,但如果您真的想在代码中这样做,您应该坚持使用 Server.Transfer,因为它会为您节省回发。
【讨论】:
customErrors statusCode="404" 会导致 302 临时重定向,然后是 404(如果您已在 404 页面代码中设置)。
因此,您应该在 global.asax 或错误 HttpModule 中为您执行以下操作:
protected void Application_Error(Object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
if (exception is HttpUnhandledException)
{
if (exception.InnerException == null)
{
Server.Transfer(ERROR_PAGE_LOCATION, false);
return;
}
exception = exception.InnerException;
}
if (exception is HttpException)
{
if (((HttpException)exception).GetHttpCode() == 404)
{
Server.ClearError();
Server.Transfer(NOT_FOUND_PAGE_LOCATION);
return;
}
}
if (Context != null && Context.IsCustomErrorEnabled)
Server.Transfer(ERROR_PAGE_LOCATION, false);
else
Log.Error("Unhandled exception trapped in Global.asax", exception);
}
编辑:哦,Best way to implement a 404 in ASP.NET 让我走上了命令式 Server.ClearError();
请参阅 http://www.andornot.com/blog/post/Handling-404-errors-with-ASPNET.aspx 了解我所做的涵盖所有这些的帖子。
【讨论】:
Response.Redirect 将在重定向页面上先执行 302,而不是 404。 Server.Transfer 将保留 URL,因此在请求的页面上是 404。
我认为这一切都归结为 SEO。我建议使用 Server.Transfer,因为浏览器/搜索引擎更清楚地发现未找到请求的 URL。如果您使用 Response.Redirect 请求的页面被“临时”重定向到一个未找到的页面。那不好……302不是个好主意。
【讨论】: