2009-06-21 24 views
43

Nginx + PHP (su fastCGI) funziona perfettamente per me. Quando inserisco un percorso in un file PHP che non esiste, invece di ottenere la pagina di errore 404 predefinita (che viene fornita per qualsiasi file .html non valido), ottengo semplicemente un "Nessun file di input specificato".Nginx - Personalizzazione della pagina 404

Come posso personalizzare questa pagina di errore 404?

risposta

33

Si utilizza la proprietà error_page in nginx config.

Per esempio, se avete intenzione di impostare la pagina di errore 404 per /404.html, utilizzare

error_page 404 /404.html; 

Impostazione della pagina di errore 500 per /500.html è semplice come:

error_page 500 /500.html; 
+2

Anche se il collegamento è OK e la risposta funziona minimamente, senza il collegamento, potrebbe beneficiare di elaborazione supplementare. – Paul

+0

@Paul I 100% sono d'accordo con te su questo, quindi ho aggiunto alcuni esempi di codice a questa risposta ;-) –

101

È possibile impostare una pagina di errore personalizzata per ogni blocco di posizione in nginx.conf o una pagina di errore globale per il sito nel suo complesso.

Per reindirizzare ad un semplice 404 pagina non trovata per una posizione specifica:

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

Un sito un'ampia pagina 404:

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

È possibile aggiungere codici di errore standard di insieme per avere una singola pagina per diversi tipi di errori:

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

Per reindirizzare a un server completamente diverso, ass g si ha avuto un server denominato Server2 upstream definito nella vostra sezione 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; 
    } 

Il manual può darvi maggiori dettagli, oppure si può cercare su Google per i termini nginx.conf e error_page per esempi di vita reale sul web.

+1

Sai se è possibile utilizzare un carattere jolly di errore? Qualcosa come 'error_page 50 * = /error_50x.html;'? –

+0

I caratteri jolly non sono consentiti - la pagina wiki per questo comando server è qui http://wiki.nginx.org/NginxHttpCoreModule#error_page - inoltre non sono necessari poiché i codici di errore sono definiti dal protocollo HTTP che non cambia molto spesso. Vedi http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html o http://en.wikipedia.org/wiki/List_of_HTTP_status_codes per l'elenco completo e suppongo aggiungere i numeri che ti piacciono se ci pensi saranno i futuri codici necessari. –

+1

Grazie. Attualmente ho 3 regole: '/ 403.html','/404.html' e '/ 5xx.html', condividono tutti la stessa' root', ma in qualche modo se si specifica la posizione '~/(?: 40 [ 34] | 5xx) [.] Html $ 'renderà le pagine di errore di nginx predefinite, tuttavia, se utilizzo una posizione non regex, funziona. Hai idea del perché ciò accada? –

27

Il parametro "error_page" non è sufficiente.

La soluzione più semplice è

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; 
    } 

A proposito, se si vuole Nginx per elaborare 404 lo stato restituito da script PHP, è necessario aggiungere

fastcgi_intercept_errors su;

E.g.

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

grazie mille per aver postato questo @Grigori, ho usato il tuo codice qui sopra per risolvere il mio problema con nginx –

+0

E per quanto riguarda i file Php?!? –

+1

Perfetto, 'fastcgi_intercept_errors on' è esattamente quello che stavo cercando. – wildpeaks

14

Queste risposte non sono raccomandati in quanto try_files opere più veloce di if in questo contesto. Basta aggiungere try_files nel vostro php blocco posizione per verificare se il file esiste, altrimenti restituisce un 404.

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

stare attenti con la sintassi!Grande Tartaruga li ha usati in modo intercambiabile, ma:

error_page 404 = /404.html;

restituirà la pagina 404.html con un codice di stato 200 (a causa = ha trasmesso che a questa pagina)

error_page 404 /404.html;

Will restituire la pagina 404.html con un (404) codice di errore (originale).

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

+1

Questo è un dettaglio importante! –

+1

E 2 anni dopo ho corretto il mio codice. Grazie dhr_p. :) –

Problemi correlati