2009-06-21 27 views
43

Nginx + PHP (en fastCGI) funciona muy bien para mí. Cuando ingreso una ruta a un archivo PHP que no existe, en lugar de obtener la página de error 404 predeterminada (que viene para cualquier archivo .html no válido), simplemente obtengo un "No se especificó ningún archivo de entrada".Nginx - Personalización de la página 404

¿Cómo puedo personalizar esta página de error 404?

Respuesta

33

Utiliza la propiedad error_page en el nginx config.

Por ejemplo, si la intención de establecer la página de error 404 a /404.html, utilice

error_page 404 /404.html; 

Configuración de la página de error 500 a /500.html es tan fácil como:

error_page 500 /500.html; 
+2

pesar de que el enlace es correcto y la respuesta mínimamente funciona sin el vínculo, puede beneficiarse de la elaboración adicional. – Paul

+0

@Paul I 100% de acuerdo con usted en esto, por lo tanto agregué algunos ejemplos de código a esta respuesta ;-) –

101

Usted puede configurar una página de error personalizada para cada bloque de ubicación en su nginx.conf, o una página de error global para el sitio como un todo.

Para redirigir a una simple página 404 no encontrado para una ubicación específica:

location /my_blog { 
    error_page 404 /blog_article_not_found.html; 
} 

Un sitio de ancho página 404:

server { 
    listen 80; 
    error_page 404 /website_page_not_found.html; 
    ... 

Puede anexar códigos de error estándar en conjunto para tener una sola página para varios tipos de errores:

location /my_blog { 
    error_page 500 502 503 504 /server_error.html 
} 

para redirigir a un servidor totalmente diferente, dando por sentado g que tenía un servidor llamado servidor 2 aguas arriba definida en su sección http:

upstream server2 { 
    server 10.0.0.1:80; 
} 
server { 
    location /my_blog { 
     error_page 404 @try_server2; 
    } 
    location @try_server2 { 
     proxy_pass http://server2; 
    } 

El manual le puede dar más detalles, o puede buscar en Google de los términos y nginx.conf error_page de ejemplos de la vida real en la web.

+1

¿Sabe si es posible usar un comodín de error? Algo como 'error_page 50 * = /error_50x.html;'? –

+0

No se permiten comodines. La página wiki de este comando del servidor está aquí http://wiki.nginx.org/NginxHttpCoreModule#error_page. Tampoco son necesarios ya que los códigos de error están definidos por el protocolo HTTP que no cambia. muy a menudo. Consulte http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html o http://en.wikipedia.org/wiki/List_of_HTTP_status_codes para obtener la lista completa y supongo que agregue los números que desee si piensa que existen serán códigos futuros necesarios. –

+1

Gracias. Actualmente tengo 3 reglas: '/ 403.html','/404.html' y '/ 5xx.html', todas comparten la misma' raíz' pero de alguna manera si especifico la ubicación '~/(?: 40 [ 34] | 5xx) [.] Html $ 'renderizará las páginas de error de nginx predeterminadas, sin embargo, si uso una ubicación que no sea de regex, funciona. ¿Tienes alguna idea de por qué sucede eso? –

27

El parámetro "error_page" no es suficiente.

La solución más fácil es

server{ 
    root /var/www/html; 
    location ~ \.php { 
     if (!-f $document_root/$fastcgi_script_name){ 
      return 404; 
     } 
     fastcgi_pass 127.0.0.1:9000; 
     include fastcgi_params.default; 
     fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; 
    } 

Por cierto, si quieres Nginx para procesar 404 de estado devuelto por los scripts PHP, es necesario agregar

fastcgi_intercept_errors sucesivamente;

E.g.

location ~ \.php { 
     #... 
     error_page 404 404.html; 
     fastcgi_intercept_errors on; 
    } 
+0

muchas gracias por publicar este @Grigori, he usado su código anterior para arreglar mi problema nginx también –

+0

¿Qué hay de ningún archivo Php?!? –

+1

Perfecto, 'fastcgi_intercept_errors on' es exactamente lo que estaba buscando. – wildpeaks

14

Estas respuestas ya no se recomiendan ya try_files funciona más rápido que if en este contexto. Basta con añadir try_files en el bloque de ubicación php para comprobar si existe el archivo, en caso contrario devuelve un 404.

location ~ \.php { 
    try_files $uri =404; 
    ... 
} 
28

tener cuidado con la sintaxis!Gran tortuga ellos utilizan indistintamente, pero:

error_page 404 = /404.html;

devolverá la página 404.html con un código de estado de 200 (= porque ha transmitido que a esta página)

error_page 404 /404.html;

Will devuelva la página 404.html con un código de error 404 (el original).

https://serverfault.com/questions/295789/nginx-return-correct-headers-with-custom-error-documents

+1

¡Este es un detalle importante! –

+1

Y 2 años después he corregido mi código. Gracias dhr_p. :) –

Cuestiones relacionadas