10
votes

In my asp.net web site I have custom error pages defined as following in my web.config file.

<customErrors mode="On" defaultRedirect="~/defaulterror.htm" >
<error statusCode="404" redirect="~/404.htm" />

When file is not found it correctly display 404.htm page but the issue is when I do Fiddler trace it returns 302 as HTTP status code.This is a big issue for search engine page indexing due to this lot of broken links still have been indexed recently because of this in my web site. how can I prevent returning 302 as HTTP status code for file not found errors and return 404 for file not found errors.I am using asp.net 3.5.

5
See this post, which is an example of a custom 404 error page solution using ASP.Net MVC filter attributes. This solution also avoids the 302 / 200 messages to the browser. The browser gets a 404 response. - sky-dev

5 Answers

20
votes

After Googling about this issue, it seems that this is the default behavior that Microsoft ASP.NET provides for the situation. This is very bad for SEO. A work around I found is to check whether the requested file exists in an HTTP handler (or global.asax file), or use:

<customErrors mode="On" redirectMode="ResponseRewrite">
    <error statusCode="404" redirect="/FileNotFound.aspx" />
</customErrors>

If the requested file does not exist, then rewrite the request path to a file not found page (if using an HTTP handler or global.asax), clear the server errors on the 404 error page code behind, and add a 404 error header to the response manually rather than waiting for server to do so.

Server.ClearError();
Response.Status = "404 Not Found";
Response.StatusCode = 404;
3
votes

In ASP.NET 4.0 you can use redirectMode="ResponseRewrite" to send nice error pages and the proper HTTP code.

0
votes

As you probably already know the 302 response is used to advise the caller that the requested resource has been moved to a different location.

When you see, in Fiddler, the 302 http code being returned is there also a 'location' declaration in the header? For example:

HTTP/1.1 302 Found
Location: http://www.yoursite.com/somewhere/blah.htm

It seems that you may have 'something' on the webserver that is intercepting the 404 returns and replacing these with 302's. I know this isn't much to go on but I would suggest that you look at the IIS configuration for the site.

0
votes

If you add the following to your 404 page code behind. You will get the correct results -

Page 404.aspx

protected void Page_Load(object sender, EventArgs e)
{
    Response.StatusCode = 404;
}
-3
votes