Best way to implement a 404 in ASP.NET
I'm trying to determine the best way to implement a 404 page in a standard ASP.NET web application. I currently catch 404 errors in the Application_Error event in the Global.asax file and redirect to a friendly 404.aspx page. The problem is that the request sees a 302 redirect followed by a 404 page missing. Is there a way to bypass the redirect and respond with an immediate 404 containing the friendly error message?
Does a web crawler such as Googlebot care if the request for a non existing page returns a 302 followed by a 404?
Solution 1:
Handle this in your Global.asax's OnError event:
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");
}
}
}
In you error page, you should ensure that you're setting the status code correctly:
// 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";
You can also handle the various other error codes in here quite nicely.
Google will generally follow the 302, and then honour the 404 status code - so you need to make sure that you return that on your error page.
Solution 2:
You can use the web.config to send 404 errors to a custom page.
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
Solution 3:
Easiest answer: don't do it in code, but configure IIS instead.
Solution 4:
I also faced with 302 instead 404. I managed to fix it by doing the following:
Controller:
public ViewResult Display404NotFoundPage()
{
Response.StatusCode = 404; // this line fixed it.
return View();
}
View:
Show some error message to user.
web.config:
<customErrors mode="On" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="~/404NotFound/" />
</customErrors>
Lastly, the RouthConfig:
routes.MapRoute(
name: "ErrorPage",
url: "404NotFound/",
defaults: new { controller = "Pages", action = "Display404NotFoundPage" }
);