Respuestas de Error Personalizadas

Aunque el Servidor Apache HTTP ofrece respuestas de error genéricos en el caso de los códigos de estado 4xx o 5xx HTTP, éstas respuestas son bastante austeras, no informativas, y puede ser intimidante para los usuarios del sitio. Si lo desea, para proporcionar respuestas de error personalizados que son o bien más amables, o en algún idioma que no sea Inglés, o tal vez que son de un estilo más acorde con su diseño del sitio.

Respuestas de error personalizadas se pueden definir para cualquier código HTTP designado como condición de error - Esto es, cualquier estado 4xx ó 5xx.

Además, se proporcionan un conjunto de valores, de manera que el documento de error puede ser personalizado más adelante, basado en los valores de estas variables, usando Inclusiones del Lado del Servidor (SSI). O bien, puede tener condiciones de error que maneje un cgi, u otro controlador dinámico (PHP, mod_perl, etc), que hace uso de estas variables.

Configuración

Los documentos de error personalizados se configuran mediante la directiva ErrorDocument, que puede ser usado en el conjunto general, de los hosts virtuales o en directorios. También pueden ser usados en los ficheros .htaccess si AllowOverrideesta configurado a FileInfo.

ErrorDocument 500 "Perdón, Nuestro escript ha fallado. ¡Ay Madre!"
ErrorDocument 500 /cgi-bin/crash-recover
ErrorDocument 500 http://error.example.com/server_error.html
ErrorDocument 404 /errors/not_found.html
ErrorDocument 401 /subscription/como_suscribirse.html

La sintaxis de la directiva de ErrorDocument es:

ErrorDocument <código-de-3-dígitos> <acción>

Donde la acción será tratada como:

  1. Una URL local a la que redireccionar (si la acción empieza con "/").
  2. Una URL externa a la que redireccionar (si la acción es una URL válida).
  3. Texto para mostrar (si ninguna de las anteriores). El texto tiene que estar entrecomillado ("ERROR") si consiste de mas de una palabra.

Cuando se redirija a una URL local, se establecen variables de entorno adicionales de manera que la respuesta puede ser personalizada. Éstas variables no se envían a URLs externas

Variables Disponibles

Redireccionando a otra URL puede ser útil, pero sólo si algo de información puede ser pasado como parámetro, lo cuál puede ser usado para explicar de forma más clara el error o crear un log del mismo.

Para conseguir esto, cuando se envía el redireccionamiento de error, se establecerán variables de entorno adicionales, que será generado a partir de las cabeceras prestadas a la solicitud original, anteponiendo 'REDIRECT_' en el nombre de la cabecera original. Esto proporciona el documento de error en el ámbito de la petición original

Por ejemplo, es posible que se reciba, además de las variables de entorno más habituales, lo siguiente:

REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/jpeg, image/png
REDIRECT_HTTP_USER_AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8
REDIRECT_PATH=.:/bin:/usr/local/bin:/sbin
REDIRECT_QUERY_STRING=
REDIRECT_REMOTE_ADDR=121.345.78.123
REDIRECT_REMOTE_HOST=client.example.com
REDIRECT_SERVER_NAME=www.example.edu
REDIRECT_SERVER_PORT=80
REDIRECT_SERVER_SOFTWARE=Apache/2.2.15
REDIRECT_URL=/cgi-bin/buggy.pl

Las variables de entorno de tipo REDIRECT_ se crean a partir de las variables de entorno que existían antes de la redirección. Se renombran con prefijo REDIRECT_, por ejemplo:, HTTP_USER_AGENT se convierte en REDIRECT_HTTP_USER_AGENT.

REDIRECT_URL, REDIRECT_STATUS, y REDIRECT_QUERY_STRING están garantizados para ser fijado, y se establecerán las otras cabeceras solo si existían antes de la condición de error.

Ninguna de estas condiciones se establecerá si elobjetivo de ErrorDocument es una redirección external (nada a partir de un nombre de esquema como http:, incluso si se refiere a la misma máquina que el servidor.

Personalizando Respuestas de Errores

Si apunta su ErrorDocument a alguna variedad de controlador dinámico como un documento que se incluye en el lado del servidor como CGI, script u otro tipo de manejador, es posible que desee utilizar las variables de entorno disponibles para personalizar esta respuesta.

Si el ErrorDocument especifica una redirección local a un script CGI, el script debe incluir un campo de cabecera de tipo "Status:" en su salida con el fin de asegurar la propagación de todo el camino de vuelta al cliente de la condición de error que se generó. Por ejemplo, un script de Perl ErrorDocument podría incluir lo siguiente:

... print "Content-type: text/html\n";
printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT_STATUS"};
...

Si el script está dedicado al manejo de una condición de error en particular, como por ejemplo 404 Not Found, puede usar el propio código y el error de texto en su lugar.

Tenga en cuenta que si la respuesta contiene Location: header (con el fin de emitir una redirección del lado del cliente), el script deberáemitir una cabecera apropiada con el Status: (como 302 Found). De lo contrario la cabecera Location: no tendrá ningún efecto.

Documentos de error personalizados Multilengua

Con la instalación de Apache HTTP Server se proporciona un directorio personal con diferentes mensajes de errores traducidos a 16 idiomas diferentes. También hay un archivo de configuración el el directorio conf/extra que puede ser incluido para añadir esta funcionalidad.

En el archivo de configuración del servidor, verá una línea como:

# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf

Descomentando éste Include habilitará esta característica, y proporcionar mensajes de error de idioma-negociado, basado en el idioma de preferencia establecido en el navegador del cliente.

Además, estos documentos contienen varias variables del tipo REDIRECT_, con lo que se le puede añadir información adicional de lo que ha ocurrido al usuario final, y que pueden hacer ahora.

Estos documentos pueden ser personalizados de cualquier forma que desee mostrar más información al usuario a cerca del su sitio web, y que podrán encontrar en él.

mod_include y mod_negotiation Tienen que estar habilitados para usar estas características.