Estoy configurando el manejo de nginx de algunas páginas de error y otros archivos multimedia "predeterminados" (como favicon.ico y robots.txt) en este momento y me encontré con un pequeño problema para que las cosas funcionen como quiero para ciertas páginas de error .
Básicamente, lo que intento hacer es servir ciertos archivos para un servidor bajo la raíz de ese servidor, por ejemplo /var/www/someserver.com/robots.txt. Si ese archivo no existe, quiero que nginx vaya al "valor predeterminado", es decir /var/www/default/robots.txt. Esta es la esencia básica de cómo tengo eso (con éxito) configurado:
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Eso funciona muy bien.
Estoy tratando de hacer lo mismo para las páginas de error, y no puedo hacer que eso suceda:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Tenga en cuenta que esto "funciona" en el sentido de que si visita someserver.com/404.html, primero intentará cargar /var/www/someserver.com/404.html y luego volver a / var / www / default /404.html si eso no se encuentra. Sin embargo, si visita someserver.com/blahblah, solo muestra la página 404 si está configurada en /var/www/someserver.com/. No vuelve al directorio predeterminado si ese archivo no existe.
De todos modos, probablemente pueda lo que estaba tratando de lograr (es por eso que incluí el primer ejemplo de trabajo).
¿Algunas ideas?
Editar:
Según la respuesta de Martin F, esto es lo que terminé armando:
# Doesn't work when error page is returned on a POST request
server {
...
root /var/www/someserver.com;
error_page 404 = @notfound;
error_page 500 502 504 = @server_error;
error_page 503 = @maintenance;
location @notfound {
try_files /404.html /../default/404.html =404;
}
location @server_error {
try_files /500.html /../default/500.html =500;
}
location @maintenance {
try_files /503.html /../default/503.html =503;
}
}
Esto funciona genial. El bloque real de páginas y ubicaciones de error anteriores se encuentra en un archivo server_defaults.conf que se incluye con cada host virtual, por lo que no codifiqué la ruta en cada ubicación y usé una ruta relativa para los valores predeterminados.
Edición 2:
Este enfoque tiene un problema. Si POST a una URL que devuelve un error, el método de solicitud POST se envía con los intentos try_files. Esto (para mí) da como resultado un error 405 No permitido, porque nginx esencialmente está intentando PUBLICAR, por ejemplo, /default/500.html en lugar de solo obtener esa página.
Edición 3:
Publiqué una solución que funciona que está mucho más cerca de mi idea original.
log_not_found off;
y agregar en suinternal;
lugar.try_files es el camino a seguir aquí. La siguiente configuración debería funcionar, pero no la he probado para detectar errores de sintaxis.
fuente
Desafortunadamente, llego un par de años tarde con mi respuesta, pero pensé que podría ayudar a los futuros buscadores. Mi versión de Nginx instalada es 1.2.4, y he creado el siguiente fragmento de configuración,
fuente
internal
.Descubrí que era crucial incluir "proxy_intercept_errors en"; en cualquier bloque de ubicación donde también se incluyó error_page.
Sin esta configuración, entonces el bloque de ubicación interceptará los códigos de error que regresan del flujo ascendente.
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
fuente