2009-08-14 12 views
5

al manejar errores 404 en ASP.NET ¿está bien establecer errores 404 para redirigir a una página que envía el código de respuesta 404 al navegador o se debe usar server.transfer para que el ¿Se puede enviar el encabezado 404 al navegador mientras la URL sigue siendo la misma?404 página response.redirect vs server.transfer

Respuesta

3

customErrors statusCode = "404" da como resultado una redirección temporal 302 y luego una 404 (si ha configurado eso en el código de la página 404).

Por lo tanto, el siguiente debe hacerlo para usted en su Global.asax o error 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); 
    } 

Editar: Ah, y Best way to implement a 404 in ASP.NET me puso en el camino hacia la Server.ClearError imperativo();

Ver http://www.andornot.com/blog/post/Handling-404-errors-with-ASPNET.aspx para una publicación que hice que cubre todo esto.

+0

Tengo curiosidad por ver su blog pero, irónicamente, la página no se encuentra. ;) – Korijn

+1

¡Oh, la ironía! Enlace fijo – Ted

2

Usaría la sección de los customerrors de la web.config, luego puede especificar la página a la que quiere ir 404.

<configuration> 
    <system.web> 
     <customErrors mode="On" defaultRedirect="Error.aspx"> 
      <error statusCode="404" redirect="404Error.aspx" /> 
     </customErrors> 
    </system.web> 
</configuration> 

En la página de recepción si desea seguir enviando el 404 se puede colocar esto en el evento Page_Load:

Response.Status = "404 Not Found"; 
+3

Aún hace una redirección de 302 temp. – Ted

0

Mi consejo es dejar que el proceso de ASP.NET hacer el trabajo por usted basado en su web.config, pero si realmente desea hacerlo en el código, debe seguir con Server.Transfer porque le ahorrará una devolución de datos.

1

Response.Redirect hará 302 primero que 404 en la página redirigida. Server.Transfer conservará la URL, por lo que es 404 en la página solicitada.

Creo que todo se reduce SEO. Sugiero usar Server.Transfer ya que es más claro para el navegador/motor de búsqueda que no se encuentra la URL solicitada. Si usa Response.Redirect, la página solicitada se redirige 'temporalmente' a una página no encontrada. Eso no es bueno ... 302 no es una buena idea.

Cuestiones relacionadas