2010-11-29 12 views
8

En mi sitio web asp.net tengo páginas de error personalizadas que se definen a continuación en mi archivo web.config.ASP.NET Página de error personalizado para 404 devuelve 302 para estado http

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

Cuando el archivo no se encuentra correctamente visualizar 404.htm página, pero el problema es cuando no calco violinista devuelve 302 como estado HTTP code.This es un gran problema para la página de búsqueda del motor de indexación debido a este lote de enlaces rotos todavía se han indexado recientemente debido a esto en mi sitio web. ¿Cómo puedo evitar devolver 302 como código de estado HTTP para errores de archivos no encontrados y devolver 404 para errores de archivos no encontrados? Estoy usando asp.net 3.5.

+1

Ver [este mensaje] (http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404 -in-asp-net-mvc/7967759 # 7967759), que es un ejemplo de una solución de página de error 404 personalizada que utiliza atributos de filtro ASP.Net MVC. Esta solución también evita los mensajes 302/200 en el navegador. El navegador obtiene una respuesta 404. –

Respuesta

15

Después de buscar en Google sobre este tema, parece que este es el comportamiento predeterminado que proporciona Microsoft ASP.NET para la situación. Esto es muy malo para SEO. Un trabajo en torno a que he encontrado es para comprobar si existe el archivo solicitado en un controlador HTTP (o archivo Global.asax), o usar:

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

Si no existe el archivo solicitado, a continuación, volver a escribir la ruta de solicitud a una página de archivo no encontrado (si utiliza un controlador HTTP o global.asax), borre los errores del servidor en el código de la página de error 404 y agregue un encabezado de error 404 a la respuesta de forma manual en lugar de esperar a que el servidor lo haga.

Server.ClearError(); 
Response.Status = "404 Not Found"; 
Response.StatusCode = 404; 
+0

¡se agregó el atributo redirectMode en .NET FW 4.0, al menos! –

+0

Esto es perfecto. La URL permanece en la misma página, pero ahora obtengo el código de estado 404 correcto. – kd7iwp

+1

oye, puedes hacer este completo ejemplo. no entiendo este. – MonsterMMORPG

0

Como probablemente ya sepa, la respuesta 302 se utiliza para avisar a la persona que llama que el recurso solicitado se ha movido a una ubicación diferente.

Cuando ve, en Fiddler, el código http 302 que se devuelve ¿hay también una declaración de 'ubicación' en el encabezado? Por ejemplo:

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

Parece que puede tener 'algo' en el servidor web que está interceptando los 404 devoluciones y sustituirlas por 302 de. Sé que esto no es mucho, pero sugiero que mires la configuración de IIS para el sitio.

-2

La solución fue aún más simple .. Por favor, echa un vistazo a mi respuesta aquí: http://blog.hebbink.com/post/2010/12/14/NET-custom-404-error-page-returns-302-for-http-status.aspx

+23

Y de ahí la importancia de incluir la solución en la respuesta (así como en el enlace): ya no parecen tener un blog . –

+7

Qué irónico es que el enlace en este punto de respuesta a ..... 404 página no encontrada :) –

+4

Y, por supuesto, no devuelve el código de error 404 ... –

2

En ASP.NET 4.0 se puede utilizar para enviar redirectMode="ResponseRewrite" páginas de error agradables y el código HTTP adecuado.

0

Si agrega lo siguiente a su código de página 404 detrás. Obtendrá los resultados correctos -

Página 404.aspx

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.StatusCode = 404; 
} 
Cuestiones relacionadas