2011-02-21 12 views
17

Tengo una página .aspx como mi página 404 personalizada en un sitio configurado en IIS 7. Necesito recuperar la URL original a la que el usuario estaba intentando acceder para poder hacer algo procesamiento en la página 404. El truco es que necesito manejar específicamente los 404 que no contienen una extensión .aspx (por ejemplo, http://example.com/testurl), que no se enrutan a través de la sección de errores personalizados de ASP.NET. Puedo configurar IIS para que apunte a mi 404 personalizado, pero en ese momento no sé cómo obtener mi URL original. ¿Alguien sabe si esto es posible?Acceso a la URL original en la redirección de IIS7 404 página

Gracias,

Mike

+1

¿Has tenido algo de suerte con tu problema? Me gustaría aclarar mi respuesta si es necesario. – rsbarro

Respuesta

24

Sí, es posible obtener la URL que causa el error 404, sólo tiene que asegurarse de que ha configurado IIS correctamente.

Hay dos casos que necesita manejar, uno es donde el error proviene de una página .aspx u otra manejada por .NET, y la otra es donde el error proviene de una carpeta incorrecta (como en su pregunta , http://example.com/testurl) o un nombre de archivo (por ejemplo, * .htm) que no maneja .NET. En IIS 7, deberá configurar un error 404 personalizado en "Páginas de error de .NET" en la sección "ASP.NET" de su aplicación web, y también en "Páginas de error" en la sección "IIS". Los cambios web.config terminan buscando algo como esto:

<system.web> 
    <!-- other system.web stuff --> 
    <customErrors defaultRedirect="/Error404.aspx" mode="On" redirectMode="ResponseRewrite"> 
     <error redirect="/Error404.aspx" statusCode="404" /> 
    </customErrors> 
</system.web> 
<system.webServer> 
    <!-- other system.webServer stuff --> 
    <httpErrors errorMode="Custom"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" prefixLanguageFilePath="" path="/Error404.aspx" responseMode="ExecuteURL" /> 
    </httpErrors> 
</system.webServer> 

Nota: el redirectMode = "ResponseRewrite" mencionado anteriormente es importante si desea que sus páginas 404 a 404 vuelven realidad mensajes y no creo que pueda establecerse a través de IIS.

En mi ejemplo, creé una página llamada Error404.aspx para manejar todos los errores 404. Cuando una página .NET (.aspx, etc.) arroja una excepción 404, el nombre del archivo original se puede encontrar en la variable aspxerrorpath querystring. Cuando un htm regular u otra página causa un error 404, la ruta original se puede leer desde la propiedad Request.RawUrl. He utilizado el siguiente código en mi página de Error404.aspx para manejar cualquiera de los casos:

public partial class Error404 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     OriginalUrl = Request.QueryString["aspxerrorpath"] ?? Request.RawUrl; 
     Server.ClearError(); 
     Response.Status = "404 not found"; 
     Response.StatusCode = 404; 
    } 

    public string OriginalUrl { get; private set; } 
} 

Por defecto, la página de error 404 no devolverá un código de estado 404, por lo que es necesario establecer de forma manual. Ver this post para más detalles.

+1

Gracias ... utilizó una combinación de esto con este artículo http://www.agilewebtechnologies.com/blog/post/2007/11/18/Redirects-Using-404-Error-Handling-in-ASPNET-20-on- Shared-Hosting- (Parte-4) .aspx para convertir a 301 redirigir. Se agregó Response.AddHeader ("Ubicación", OriginalUrl); Response.End(); al final de su código en Error404 para hacer el trabajo. – Dave

+1

gracias por su respuesta clara y detallada. No pude encontrar algo así en el sitio web de Microsoft y perdí más de 1 hora. – dvdmn

Cuestiones relacionadas