2012-04-12 21 views
13

En caso si producido un error en mi sitio web que hacer lo siguiente:¿Cómo devolver 'propio' página personalizada 404?

 Server.Transfer("/error.aspx"); 

y que la página tiene código:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ... 

    Response.StatusCode = 404; 
} 

Si trabajo en el host local a continuación, junto con 404 de estado devuelto para el página, la página muestra 'descripción correcta del error'.

Una vez que publiqué el mismo código en Internet, todas las páginas con errores todavía se muestran con código de estado 404, pero no tienen el contenido. En su lugar, tienen el mensaje de error 404 estándar:

404 - Archivo o directorio no encontrado.

si la línea "Response.StatusCode = 404" comentada se proporciona la página adecuada, pero tiene 200 código de estado.

Pregunta: cómo devolver la página de error fácil de usar que al mismo tiempo tiene el código de estado de error 404?

¡Cualquier pensamiento es bienvenido! ¡Muchas gracias por adelantado!

P.S. ASP.NET 4.0

+0

Siempre he hecho 404 páginas personalizadas de la misma manera. 1) Transfiera a la página de error 2) copia de página fácil de usar y una 404 debajo del capó para robots. Un sitio que estoy tratando de hacer ahora. Tengo exactamente el mismo problema: si agrego "Response.Status", aparece un 404 estándar, elimino el response.status y aparece la copia de la página, pero devuelve un 200 Mi suposición sin educación es algo cambiado en .NET4 framework ... – Jag

Respuesta

6

Puede lograr esto configurando su archivo web.config. Por favor, consulte el siguiente enlace a un artículo, que explica en la parte inferior de la página, cómo mostrar diferentes páginas de error personalizadas para diferentes estados de error HTTP.

12
<customErrors mode="On" defaultRedirect="~/Error/GenericErrorPage.aspx"> 

    <error statusCode="404" redirect="~/Error/404.aspx" /> 

</customErrors> 

http://msdn.microsoft.com/en-us/library/h0hfz6fc(v=vs.71).aspx

http://msdn.microsoft.com/en-us/library/aa479319.aspx

+6

Si bien es totalmente correcto, recomendaría, si es posible, no usar ASPX para las páginas de error. Si el error está relacionado con algo en el motor ASP, entonces la página de error puede no cargarse tan bien ... – justabuzz

+0

Estoy de acuerdo @justabuzz, en realidad teníamos una aplicación donde solía suceder esto: "Además, ASP .NET encontró un error al intentar para mostrar la página de error personalizado para la excepción " –

+0

Creo que una página aspx para un 404 está bien porque si se produce un error es probable que muestre la página 500 en su lugar. Pero si eso es una página aspx ... – Jag

9

Un ja!

Prueba esto:

Response.TrySkipIisCustomErrors = true; 
Response.Status = "404 Not Found"; 
Response.StatusCode = 404; 

me pareció tan pronto como he añadido Response.TrySkipIisCustomErrors=true antes de ajustar el código de estado, me gustaría ver la copia normal de la página y se devuelve un error 404. Sin esta línea, se muestra la página estándar de IIS 404.

Alternativamente, esto se puede establecer en el web.config de este modo:

<system.webServer> 
    <httpErrors existingResponse="PassThrough"> 
     // custom error page mappings 
    </httpErrors> 
</system.webServer> 

La clave aquí es existingResponse="PassThrough"

Esto se añadió a IIS7 por lo tanto se requiere en sitios que se ejecutan en el modo de canalización integrada .

Para más información: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

actualización Actualización de clarrification/más información que la gente todavía están encontrando esto útil. Vale la pena señalar que si necesita una página 404 simple y genérica, utilice el método web.config (y mejor que sea una página HTML simple).

El método que describo funciona mejor si tiene un sitio muy dinámico o controlado por CMS donde una página determinada podría devolver un 404 pero desea mostrar su información relacionada con el visitante.

Por ejemplo, una página de ofertas especiales (ofertas/algunas ofertas) podría hacer una búsqueda de la oferta (algunas ofertas) y si no existe, puede mostrar ofertas alternativas o relacionadas mientras devuelve una 404 bajo el capó. Por lo que el visitante sabe, le acaban de decir que la oferta ya no está disponible, pero todavía están en la sección de ofertas, pero también le estamos diciendo a los robots que des-indexen la URL. Esto sería mucho más difícil de hacer si solo hubiera una página genérica 404.

2

para mostrar su propia página con el correcto statuscode , puede utilizar el siguiente código:

1) En el web.config agregar lo siguiente:

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

y:

<httpErrors errorMode="Custom"> 
    <remove statusCode="404"/> 
    <error statusCode="404" path="404.htm" responseMode="File"/> 
</httpErrors> 

2) Añadir un archivo 404.htm a la raíz de su sitio web:

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>404 - Not Found</title> 
    <meta http-equiv="refresh" content="5;url=/404-PAGE" /> 
    </head> 
    <body> 
     CONTENT 
    </body> 
</html> 

Usted puede agregar contenido al cuerpo de este archivo y quitar la meta de refresco o simplemente utilizar la meta de actualización para abrir una página dentro de su CMS.

1

Combinando las respuestas de Jag y Adt, todavía tenía un problema. Cuando un 404 fue manejado por el controlador de archivos estáticos (a diferencia de ASP.NET), obtuve una respuesta en blanco. (El estado era correctamente 404.)

Para solucionarlo, tuve que agregar errorMode="Custom" al elemento <httpErrors>. Si su página de error utiliza ASP.NET, debe incluir responseMode="ExecuteURL".

<system.web> 
    <customErrors mode="On" defaultRedirect="~/Error.aspx" redirectMode="ResponseRewrite" /> 
</system.web> 

<system.webServer> 
    <httpErrors errorMode="Custom"> 
     <remove statusCode="404" /> 
     <error statusCode="404" path="/Error.aspx" responseMode="ExecuteURL" /> 
    </httpErrors> 
</system.webServer> 
Cuestiones relacionadas