2009-06-21 16 views
43

Nginx + PHP (auf FastCGI) funktioniert gut für mich. Wenn ich einen Pfad zu einer PHP-Datei eingib, die nicht existiert, bekomme ich statt der Standard-404-Fehlerseite (die für eine ungültige .html-Datei kommt) einfach eine "Keine Eingabedatei angegeben.".Nginx - Anpassen 404 Seite

Wie kann ich diese 404-Fehlerseite anpassen?

Antwort

33

Sie verwenden die Eigenschaft error_page im nginx config.

Zum Beispiel, wenn Sie die 404-Fehlerseite /404.html einstellen möchten, verwenden Sie

error_page 404 /404.html; 

die 500-Fehlerseite /500.html Einstellung ist so einfach wie:

error_page 500 /500.html; 
+2

Obwohl die Verbindung OK ist und die Antwort funktioniert minimal ohne den Link, könnte es von weiterer Ausarbeitung profitieren. – Paul

+0

@Paul I stimme zu 100% mit Ihnen überein, daher habe ich einige Codebeispiele zu dieser Antwort hinzugefügt ;-) –

101

können Sie Setup eine benutzerdefinierte Fehlerseite für jeden Standortblock in Ihrer nginx.conf oder eine globale Fehlerseite für die gesamte Website.

zu einem einfachen 404 nicht gefunden Seite für einen bestimmten Speicherort zu umleiten:

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

Eine Website breite Seite 404:

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

Sie zusammen Standardfehlercodes anhängen können eine einzelne Seite haben, für verschiedene Arten von Fehlern:

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

Um auf einen völlig anderen Server, assumin umleiten g Sie einen Upstream-Server mit dem Namen server2 hatten im http Abschnitt definiert:

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

Die manual können Ihnen weitere Informationen geben, oder Sie können Google-Suche nach den Begriffen nginx.conf und error_page für Beispiele aus der Praxis im Internet.

+1

Wissen Sie, ob es möglich ist, einen Fehlerplatzhalter zu verwenden? Etwas wie 'error_page 50 * = /error_50x.html;'? –

+0

Wildcards sind nicht erlaubt - die Wiki-Seite für diesen Serverbefehl ist hier http://wiki.nginx.org/NginxHttpCoreModule#error_page - auch sie sind nicht notwendig, da die Fehlercodes durch das HTTP-Protokoll definiert sind, das sich nicht ändert sehr oft. Siehe http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html oder http://en.wikipedia.org/wiki/List_of_HTTP_status_codes für die komplette Liste und ich denke, fügen Sie beliebige Zahlen hinzu, die Sie mögen, wenn Sie dort denken werden zukünftige Codes benötigt. –

+1

Danke. Momentan habe ich 3 Regeln: '/ 403.html','/404.html' und '/ 5xx.html', alle teilen sich die gleiche' root' aber irgendwie wenn ich den Ort '~/(?: 40 [ 34] | 5xx) [.] Html $ 'Es werden die Standard-Nginx-Fehlerseiten gerendert. Wenn ich jedoch eine Nicht-Regex-Position verwende, funktioniert es. Hast du eine Idee, warum das passiert? –

27

Der Parameter "error_page" reicht nicht aus.

Die einfachste Lösung

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

By the way, wenn Sie Nginx wollen 404 Status von PHP-Skripten zurückgegeben verarbeiten, müssen Sie

fastcgi_intercept_errors auf hinzuzufügen;

z.

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

Vielen Dank für die Veröffentlichung dieser @Grigori, Ich habe Ihren Code oben verwendet, um meine Nginx Problem zu beheben –

+0

Was ist mit keine PHP-Dateien?!? –

+1

Perfekt, 'fastcgi_intercept_errors on' ist genau das, was ich gesucht habe. – wildpeaks

14

Diese Antworten sind nicht mehr empfohlen, da try_files schneller arbeitet als if in diesem Zusammenhang. Einfach try_files in Ihrem PHP-Standort Block hinzufügen zu testen, ob die Datei vorhanden ist, sonst ein 404.

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

Seien Sie vorsichtig wieder!Große Schildkröte verwendet sie austauschbar, aber:

error_page 404 = /404.html;

die 404.html Seite mit dem Statuscode 200 Will return (da = zu dieser Seite weitergeleitet hat, dass)

error_page 404 /404.html;

Will Geben Sie die 404.html-Seite mit einem (ursprünglichen) 404-Fehlercode zurück.

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

+1

Dies ist ein wichtiges Detail! –

+1

Und 2 Jahre später habe ich meinen Code korrigiert. Danke dhr_p. :) –