Saltar la navegación

Personalización de las páginas de error

Si queremos cambiar los mensajes de error que Apache nos muestra por otros personalizados, por ejemplo, para que se adapten al estilo de nuestro sitio web, debemos recurrir a la directiva ErrorDocument, pudiendo solo personalizar los errores 4xx y 5xx.

Directiva ErrorDocument

Sintaxis: ErrorDocument código-error documento

Contexto: server config, virtual host, directory, .htaccess

El mensaje de error irá en documento, que puede ser:

  1. Un texto simple.
  2. Una ruta absoluta interna del sitio web a un fichero con el mensaje de error.
  3. Una URL externa del sitio web que contiene el mensaje de error.

No es obligatorio que la personalización de los errores se haga siempre de forma estática, con un fichero html, puede también realizarse a través de un programa, PHP, Perl, etc.

Por ejemplo:

ErrorDocument "Error: Fichero no encontrado"
ErrorDocument "<h1>Error: Fichero no encontrado</h1"
ErrorDocument "/errores/no-encontrado.html"
ErrorDocument "http://www.sitio.com/errores/no-encontrado.html"

Si sobre un directorio que hereda los mensajes de errores personalizados, queremos recuperar los mensajes originales de Apache, podemos usar la palabra default:

ErrorDocument default

Apache posee una configuración especial que permite mostrar a nivel global unos mensajes de error personalizados en el mismo idioma que la petición del cliente. Para preparar esta configuración debemos editar el fichero /etc/apache2/conf-available/localized-error-pages.conf y descomentar las siguientes líneas:

#<IfModule mod_negotiation.c>
#       <IfModule mod_include.c>
#               <IfModule mod_alias.c>
#
#                       Alias /error/ "/usr/share/apache2/error/"
#
#                       <Directory "/usr/share/apache2/error">
#                               Options IncludesNoExec
#                               AddOutputFilter Includes html
#                               AddHandler type-map var
#                               Order allow,deny
#                               Allow from all
#                               LanguagePriority en cs de es fr it nl sv pt-br ro
#                               ForceLanguagePriority Prefer Fallback
#                       </Directory>
#
#                       ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
#                       ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
#                       ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
#                       ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
#                       ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
#                       ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
#                       ErrorDocument 410 /error/HTTP_GONE.html.var
#                       ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
#                       ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
#                       ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
#                       ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
#                       ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
#                       ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
#                       ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
#                       ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
#                       ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
#                       ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var
#               </IfModule>
#       </IfModule>
#</IfModule>

Es necesario que los módulos mod_negotiation, mod_alias y mod_include estén habilitados.

Podemos ver en el fichero /usr/share/apache2/error/HTTP_NOT_FOUND.html.var el mensaje en español para el error de recurso no encontrado (404):

<!--#include virtual="include/bottom.html" -->
----------en--

Content-language: es
Content-type: text/html
Body:----------es--
<!--#set var="TITLE" value="¡Objeto no localizado!" -->
<!--#include virtual="include/top.html" -->

    No se ha localizado la URL solicitada en este servidor.

  <!--#if expr="-n v('HTTP_REFERER')" -->

    La URL de la <a href="<!--#echo encoding=" url="" var="HTTP_REFERER" --="">">página que le ha remitido</a> 
    parece ser errónea o estar obsoleta. Por favor, informe del error 
    al autor de <a href="<!--#echo encoding=" url="" var="HTTP_REFERER" --="">">esa
    página</a>.

  <!--#else -->

    Si usted ha introducido la URL manualmente, por favor revise su
    ortografía e inténtelo de nuevo.

  <!--#endif -->

<!--#include virtual="include/bottom.html" -->
----------es--

Content-language: fr
Content-type: text/html; charset=UTF-8
Body:----------fr--

Como todo esto es una de las configuraciones que ofrece Apache debemos asegurarnos de que está activa mirando si se encuentra localized-error-pages.conf en /etc/apache2/conf-enabled, y si no lo está, usamos a2encon para activarla.