asp.net - net - ¿Es posible usar una ruta relativa al configurar una página de error personalizada en IIS7?
httperrors (2)
Estoy intentando establecer una página de error 404 personalizada para mi aplicación web. El problema es que esta aplicación se implementará en varios entornos diferentes. A veces estará en un directorio virtual y otras no.
Tengo la página de error en un directorio llamado ErrorPages y he configurado mi configuración de esta manera:
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404"/>
<error statusCode="404" path="/VirtualDir/ErrorPages/404.aspx" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
El problema es que cuando implemento esto en la raíz de un sitio web, la parte /VirtualDir
debe eliminarse. Si lo elimino antes de la implementación, necesito volver a agregarlo cuando se implementa en un directorio virtual. ¿Hay alguna manera en que pueda configurar la ruta de acceso para que sea relativa al directorio virtual y no al sitio?
He intentado usar un ~
, pero eso tampoco funciona, así:
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404"/>
<error statusCode="404" path="~/ErrorPages/404.aspx" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
Me enfrenté a un problema similar, por lo que utilicé el código del lado del servidor para redirigir a la página CustomError con la URL generada dinámicamente (con o sin directorio virtual), aunque ~ / redirigió con éxito a la ruta correcta desde aquí.
Cuando se produce un error en la aplicación, se ejecuta Application_Error y finalmente se activa este bloque de código:
if (App.Configuration.DebugMode == DebugModes.ApplicationErrorMessage)
{
string stockMessage = App.Configuration.ApplicationErrorMessage;
// Handle some stock errors that may require special error pages
HttpException httpException = serverException as HttpException;
if (httpException != null)
{
int HttpCode = httpException.GetHttpCode();
Server.ClearError();
if (HttpCode == 404) // Page Not Found
{
Response.StatusCode = 404;
Response.Redirect("~/ErrorPage.aspx"); // ~ works fine no matter site is in Virtual Directory or Web Site
return;
}
}
Response.TrySkipIisCustomErrors = true;
Response.StatusCode = 404;
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
En lugar de escribir la ruta de la página en la sección httpErrors de web.config, puede crear una configuración de aplicación y guardar la ruta allí. En el código que está detrás, puede obtener la ruta desde la configuración de la aplicación y redirigir como se describe anteriormente.
Encontré otro enlace similar y él lo explicó mejor que yo, así que simplemente vaya a http://labs.episerver.com/en/Blogs/Ted-Nyberg/Dates/112276/2/Programmatically-configure-customErrors-redirects/
Podría usar transformaciones web.config para establecer la ruta por entorno:
web.config
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404"/>
<error statusCode="404" path="/VirtualDir/ErrorPages/404.aspx" responseMode="ExecuteURL" />
</httpErrors>
Web.Release.config
<httpErrors>
<error statusCode="404" path="/ErrorPages/404.aspx" responseMode="ExecuteURL" />
</httpErrors>