By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,984 Members | 1,386 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,984 IT Pros & Developers. It's quick & easy.

404 best practice

P: n/a
I have a website where I wish to display a custom 404 error page when
applicable. I also want to ensure that when a search engine hits a
page that no longer exists, it gets a StatusCode of 404 so it will
eventually remove it from it's index.

Currently to do this, I'm capturing all errors using the
global.asax.cs -Application_Error proc, setting the approriate
status code and redirecting:

if (CheckForErrorType(exc, "System.Web.HttpException") &&
exc.Message.ToString().IndexOf("does not exist") 0)
{
Response.StatusCode = 404;
Response.Redirect("/pagenotfound.aspx", true);
}

When I load Fidder, it tells me that the missing page *is* being
loaded, returning a status code of 302 (object moved) then my friendly
error page is being loaded with the appropriate 404 code which is
useless.

My 404 page inherits from a Master Page, which checks for a Session so
I can't use a Server.Transfer as I get the error:

An exception of type 'System.Web.HttpException' occurred in
System.Web.dll but was not handled in user code

Additional information: Session state can only be used when
enableSessionState is set to true, either in a configuration file or
in the Page directive. Please also make sure that
System.Web.SessionStateModule or a custom session state module is
included in the <configuration>\<system.web>\<httpModulessection in
the application configuration.

Alternatively, I've tried using the CustomErrors tag in web.config:
<customErrors mode="RemoteOnly">
<error statusCode="404" redirect="/pagenotfound.aspx"/>
</customErrors>

Again, using Fiddler, it returns first the 302 status then the 404.

Has anyone else come across this issue and found a decent solution?

TIA

May 31 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
You're getting 302 due to the Redirect. Can't you set up a custom 404 page
via IIS admin rather than handling it in your code? That should preserve
the 404 status.

"Dunc" <du**********@gmail.comwrote in message
news:11**********************@h2g2000hsg.googlegro ups.com...
>I have a website where I wish to display a custom 404 error page when
applicable. I also want to ensure that when a search engine hits a
page that no longer exists, it gets a StatusCode of 404 so it will
eventually remove it from it's index.

Currently to do this, I'm capturing all errors using the
global.asax.cs -Application_Error proc, setting the approriate
status code and redirecting:

if (CheckForErrorType(exc, "System.Web.HttpException") &&
exc.Message.ToString().IndexOf("does not exist") 0)
{
Response.StatusCode = 404;
Response.Redirect("/pagenotfound.aspx", true);
}

When I load Fidder, it tells me that the missing page *is* being
loaded, returning a status code of 302 (object moved) then my friendly
error page is being loaded with the appropriate 404 code which is
useless.

My 404 page inherits from a Master Page, which checks for a Session so
I can't use a Server.Transfer as I get the error:

An exception of type 'System.Web.HttpException' occurred in
System.Web.dll but was not handled in user code

Additional information: Session state can only be used when
enableSessionState is set to true, either in a configuration file or
in the Page directive. Please also make sure that
System.Web.SessionStateModule or a custom session state module is
included in the <configuration>\<system.web>\<httpModulessection in
the application configuration.

Alternatively, I've tried using the CustomErrors tag in web.config:
<customErrors mode="RemoteOnly">
<error statusCode="404" redirect="/pagenotfound.aspx"/>
</customErrors>

Again, using Fiddler, it returns first the 302 status then the 404.

Has anyone else come across this issue and found a decent solution?

TIA

May 31 '07 #2

P: n/a
a redirect is a 302. you should do a server transfer rather than a
client redirect.

-- bruce (sqlwork.com)
Dunc wrote:
I have a website where I wish to display a custom 404 error page when
applicable. I also want to ensure that when a search engine hits a
page that no longer exists, it gets a StatusCode of 404 so it will
eventually remove it from it's index.

Currently to do this, I'm capturing all errors using the
global.asax.cs -Application_Error proc, setting the approriate
status code and redirecting:

if (CheckForErrorType(exc, "System.Web.HttpException") &&
exc.Message.ToString().IndexOf("does not exist") 0)
{
Response.StatusCode = 404;
Response.Redirect("/pagenotfound.aspx", true);
}

When I load Fidder, it tells me that the missing page *is* being
loaded, returning a status code of 302 (object moved) then my friendly
error page is being loaded with the appropriate 404 code which is
useless.

My 404 page inherits from a Master Page, which checks for a Session so
I can't use a Server.Transfer as I get the error:

An exception of type 'System.Web.HttpException' occurred in
System.Web.dll but was not handled in user code

Additional information: Session state can only be used when
enableSessionState is set to true, either in a configuration file or
in the Page directive. Please also make sure that
System.Web.SessionStateModule or a custom session state module is
included in the <configuration>\<system.web>\<httpModulessection in
the application configuration.

Alternatively, I've tried using the CustomErrors tag in web.config:
<customErrors mode="RemoteOnly">
<error statusCode="404" redirect="/pagenotfound.aspx"/>
</customErrors>

Again, using Fiddler, it returns first the 302 status then the 404.

Has anyone else come across this issue and found a decent solution?

TIA
May 31 '07 #3

P: n/a
Thanks, Bruce. Unfortunately, the 404 page derives from a master
page, which checks session. After some research, it seems the
Application_Error no longer holds a reference to the current
HttpContext, so redirecting from that causes the 404 page to create
that obscure error about not having session enabled.

D

On 31 May, 16:00, bruce barker <nos...@nospam.comwrote:
a redirect is a 302. you should do a server transfer rather than a
client redirect.

-- bruce (sqlwork.com)

Dunc wrote:
I have a website where I wish to display a custom 404 error page when
applicable. I also want to ensure that when a search engine hits a
page that no longer exists, it gets a StatusCode of 404 so it will
eventually remove it from it's index.
Currently to do this, I'm capturing all errors using the
global.asax.cs -Application_Error proc, setting the approriate
status code and redirecting:
if (CheckForErrorType(exc, "System.Web.HttpException") &&
exc.Message.ToString().IndexOf("does not exist") 0)
{
Response.StatusCode = 404;
Response.Redirect("/pagenotfound.aspx", true);
}
When I load Fidder, it tells me that the missing page *is* being
loaded, returning a status code of 302 (object moved) then my friendly
error page is being loaded with the appropriate 404 code which is
useless.
My 404 page inherits from a Master Page, which checks for a Session so
I can't use a Server.Transfer as I get the error:
An exception of type 'System.Web.HttpException' occurred in
System.Web.dll but was not handled in user code
Additional information: Session state can only be used when
enableSessionState is set to true, either in a configuration file or
in the Page directive. Please also make sure that
System.Web.SessionStateModule or a custom session state module is
included in the <configuration>\<system.web>\<httpModulessection in
the application configuration.
Alternatively, I've tried using the CustomErrors tag in web.config:
<customErrors mode="RemoteOnly">
<error statusCode="404" redirect="/pagenotfound.aspx"/>
</customErrors>
Again, using Fiddler, it returns first the 302 status then the 404.
Has anyone else come across this issue and found a decent solution?
TIA- Hide quoted text -

- Show quoted text -

May 31 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.