我正在尝试确定在标准 ASP.NET Web 应用程序中实现 404 页面的最佳方式。我目前在 Global.asax 文件中的 Application_Error 事件中捕获 404 错误并重定向到友好的 404.aspx 页面。问题是请求看到 302 重定向,然后是 404 页面丢失。有没有办法绕过重定向并立即响应包含友好错误消息的 404?
如果对不存在页面的请求返回 302 后跟 404,Googlebot 等网络爬虫是否关心?
我正在尝试确定在标准 ASP.NET Web 应用程序中实现 404 页面的最佳方式。我目前在 Global.asax 文件中的 Application_Error 事件中捕获 404 错误并重定向到友好的 404.aspx 页面。问题是请求看到 302 重定向,然后是 404 页面丢失。有没有办法绕过重定向并立即响应包含友好错误消息的 404?
如果对不存在页面的请求返回 302 后跟 404,Googlebot 等网络爬虫是否关心?
在 Global.asax 的 OnError 事件中处理此问题:
protected void Application_Error(object sender, EventArgs e){
// An error has occured on a .Net page.
var serverError = Server.GetLastError() as HttpException;
if (serverError != null){
if (serverError.GetHttpCode() == 404){
Server.ClearError();
Server.Transfer("/Errors/404.aspx");
}
}
}
在您的错误页面中,您应该确保正确设置状态代码:
// If you're running under IIS 7 in Integrated mode set use this line to override
// IIS errors:
Response.TrySkipIisCustomErrors = true;
// Set status code and message; you could also use the HttpStatusCode enum:
// System.Net.HttpStatusCode.NotFound
Response.StatusCode = 404;
Response.StatusDescription = "Page not found";
您还可以很好地处理此处的各种其他错误代码。
Google 通常会遵循 302,然后遵守 404 状态代码 - 因此您需要确保在错误页面上返回该代码。
您可以使用 web.config 将 404 错误发送到自定义页面。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
最简单的答案:不要在代码中这样做,而是配置 IIS。
我也遇到了 302 而不是 404。我设法通过执行以下操作来修复它:
控制器:
public ViewResult Display404NotFoundPage()
{
Response.StatusCode = 404; // this line fixed it.
return View();
}
看法:
向用户显示一些错误消息。
网络配置:
<customErrors mode="On" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="~/404NotFound/" />
</customErrors>
最后,RouthConfig:
routes.MapRoute(
name: "ErrorPage",
url: "404NotFound/",
defaults: new { controller = "Pages", action = "Display404NotFoundPage" }
);
我真的很喜欢这种方法:它创建一个视图来处理所有错误类型并覆盖 IIS。
[1]:从 Web.config 中删除所有“customErrors”和“httpErrors”
[2]:检查 'App_Start/FilterConfig.cs' 看起来像这样:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
}
[3]:在“Global.asax”中添加这个方法:
public void Application_Error(Object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Server.ClearError();
var routeData = new RouteData();
routeData.Values.Add("controller", "ErrorPage");
routeData.Values.Add("action", "Error");
routeData.Values.Add("exception", exception);
if (exception.GetType() == typeof(HttpException))
{
routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
}
else
{
routeData.Values.Add("statusCode", 500);
}
Response.TrySkipIisCustomErrors = true;
IController controller = new ErrorPageController();
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
Response.End();
}
[4]:添加“控制器/ErrorPageController.cs”
public class ErrorPageController : Controller
{
public ActionResult Error(int statusCode, Exception exception)
{
Response.StatusCode = statusCode;
ViewBag.StatusCode = statusCode + " Error";
return View();
}
}
[5]:在“视图/共享/Error.cshtml”中
@model System.Web.Mvc.HandleErrorInfo
@{
ViewBag.Title = (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500 Error";
}
<h1 class="error">@(!String.IsNullOrEmpty(ViewBag.StatusCode) ? ViewBag.StatusCode : "500 Error"):</h1>
//@Model.ActionName
//@Model.ContollerName
//@Model.Exception.Message
//@Model.Exception.StackTrace
:D
你在任何地方都用这个吗?
Response.Status="404 Page Not Found"
我可以看到在 web.config 中设置 404 页面是一种很好的干净方法,但它最初仍会以 302 重定向响应错误页面。例如,如果您导航到:
https://stackoverflow.com/x.aspx
您将通过 302 重定向重定向到:
https://stackoverflow.com/404?aspxerrorpath=/x.aspx
我想要发生的是:
没有重定向。对丢失 URL 的请求会返回 404 状态代码和友好的错误消息。
您可以将 IIS 本身配置为返回特定页面以响应任何类型的 http 错误(包括 404)。
我认为最好的方法是使用 web.config 中的自定义错误构造,如下所示,这让您可以连接页面以简单有效的方式处理所有不同的 HTTP 代码。
<customErrors mode="On" defaultRedirect="~/500.aspx">
<error statusCode="404" redirect="~/404.aspx" />
<error statusCode="500" redirect="~/500.aspx" />
</customErrors>