Nginx - Pass alle 404-Fehler zurück zu PHP-FPM für benutzerdefinierte Fehlerseite Verarbeitung
Ich weiß, das wurde schon tausendmal gefragt, aber all die Antworten, die ich fand einfach keine Arbeit (für mich oder in der Regel die original OP der Fragen)... Also, ich werde versuchen zu erklären, das problem so gut wie ich nur kann und ich hoffe, wir bekommen es für mich arbeiten, und für die anderen, die haben vorher gefragt.
Meiner Nginx-config (mit vielen anderen irrelevanten Sachen zu entfernen) ist wie folgt:
http {
# Config from here removed
server {
listen 80;
listen 443 ssl;
server_name mydomain.co.uk;
ssl_certificate /xxxxxxx.crt;
ssl_certificate_key /xxxxxxx.key;
# Custom error pages
root /var/www/viovet_frontend;
error_page 404 = /error404.php;
# Any simple .php page
location ~ \.php$ {
root /var/www/xxxxxx;
#index index.php index.html;
include /etc/nginx/fastcgi.conf;
fastcgi_pass phpfastcgiservers;
include fastcgi_params;
fastcgi_intercept_errors on;
}
# Lots more config and re-write rules here removed
}
upstream phpfastcgiservers {
server xxxxx1:9001;
server xxxxx2:9001;
server xxxxx3:9001;
fair;
}
}
Alles was ich versuche zu tun bekommen, Nginx, alle zu fangen 404 und senden Sie zurück zu PHP-FPM über location ~ \.php$
um eine benutzerdefinierte Fehlerseite, die dem Benutzer angezeigt, aber ich bekomme immer die standard Nginx error-Seite.
Den folgenden urls sollten alle zeigen die Ausgabe von mydomain.co.uk/error404.php
:
- mydomain.co.uk/someNonExistantFile (didn ' T match any location-Blöcke)
- mydomain.co.uk/someMissingFile.php (abgestimmt .php-Datei Speicherort blockieren aber die Datei nicht vorhanden ist)
Aber Sie zeigen tatsächlich die standard Nginx 404-Seite. Wenn die location ~ \.php$
gibt einen anderen Fehler-code 404 (e.g 5xx) dann werden wir uns nicht engagieren wollen, einfach nur wieder die Inhalte und Header, die FastCGI kehrte in den ersten Platz.
Ich hoffe das macht Sinn und mir kann jemand helfen. Vielen Dank im Voraus.
EDIT: ich habe versucht, indem recursive_error_pages on;
auf die Linie nach # Custom error pages
aber diese tatsächlich bewirkt, dass alle Nginx 404 Not Found
Fehler zu Nginx 500 Internal Server Error
Fehler.
EDIT: Hinzufügen von weiteren Dateien:
/etc/nginx/fastcgi.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
fastcgi_params
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
Ich denke, dass ich wahrscheinlich nicht brauchen diese beiden sowieso! 😉
- Versuchen Sie, root /var/www/xxxx außerhalb Ihres Standorts ~php.
- PHP-FPM und Nginx sind auf verschiedenen Maschinen. Dies zu tun (allein) nicht helfen, Nginx, schicken Sie es zurück zu PHP-FPM.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich schließlich gearbeitet, das meiste davon aus. Danke an alle für Ihre Tipps und die Zeit, zu schreiben, zu beantworten.
Das Problem ist, dass unsere
error404.php
wurde wieder unsere Fehler-Seite mit einem 404 not Found header zu (mitheader('HTTP/1.0 404 Not Found');
) und Nginx wurde dann das abfangen dieser Fehler alsrecursive_error_pages
deaktiviert ist (Standardeinstellung), und es war zeigt es die eigene 404-Seite. Ausschaltenfastcgi_intercept_errors
ist die Lösung. Wenn wir entfernen Sie dieheader('HTTP/1.0 404 Not Found');
aus den Fehler-Datei, dann würden wir den Fehler aber mit einem200
das ist natürlich nicht das, was wir wollen.Dies bedeutet allerdings nicht, lösen das problem auf eine fehlende Seite endet mit
.php
(so entspricht der Lage-block, wie wir Sie jetzt wieder die standard-PHP-FPM Antwort auf diejenigen, die einen 404-header mit dem KörperFile not found.
. Ich könnte Nate ' s Antwort um dies zu umgehen, aber ich möchte lieber nicht angeben müssen, alle Dateinamen gibt. Ich werde sehen, was für eine andere Lösung für dieses und es hier posten, wenn ich eins bekommen.EDIT: EINE weitere vollständige Lösung:
Müssen Sie zum abfangen von Fehlern in der Haupt-php-location block (
fastcgi_intercept_errors
iston
) und dann haben Sie einen weiteren Baustein für Ihre eigenen Fehler-Seiten, wo Sie nicht, Sie aufzuhalten. Sehen Sie diese config-Beispiel:Dies bedeutet, dass Ihre PHP-Seiten, die einen HTTP-status code 404 haben, eigene Inhalte (wenn vorhanden) wird ignoriert und der Inhalt Ihrer
/http_errors/404.php
- Datei wird stattdessen verwendet werden./http_errors/
? Mit einem location-block, Spiele '404.php' so gut funktioniert.Ich glaube, was Sie fordert, ist nicht möglich, mit nginx allein - es sei denn, Sie konfigurieren jeden bekannt .php-Datei manuell. Wenn Sie können die Liste bekannt .php-Dateien können Sie erkennen, erwartet 404 basierend auf diesen Informationen. Anstelle der Erfassung aller .php-Dateien mit einem regulären Ausdruck geben Sie bekannt, php-Dateien:
Ersetzen
location ~ \.php$ {}
mit so etwas wie:Wird dies jedoch nicht erfassen, ein 404 erzeugt durch Ihre off-Maschine php-fpm, wenn eine Anforderung für eine vermeintlich bekannte php-Datei wie index.php gibt 404 zurück, obwohl Sie gesagt haben, nginx, sollte es existieren.
Eine vollständige Lösung würde wahrscheinlich erfordern einen zusätzlichen server vor deine nginx-server erkennt, dass ein 404-Antwort vom php-fpm/nginx, was wäre dann der proxy eine andere round-trip-request, um Ihre back-End für die error404.php - Datei. Sie würde immer noch laufen in das problem, Ihre error404.php Datei auch wieder eine 404 selbst. Ich sah in Lack, um zu sehen, wenn eine erkannte 404 erzeugen konnte eine zweite Anfrage an den Ursprungsserver für eine Fehler-Seite, aber leider ist die vcl_backend_error kann nur noch dazu dienen, 404, oder wiederholen Sie die Anforderung. Lack - oder etwas ähnliches - das hätte vielleicht einige Weg, um zu erreichen, was Sie wollen, aber es wird nicht einfach sein.
Kann ich nur sagen dies ist ein Grund, warum die meisten Menschen nicht einrichten nginx und php-fpm auf verschiedenen Rechnern - es Kopfschmerzen verursacht wie dieser. Wenn möglich, sollten Sie wirklich halten nginx und php-fpm auf der gleichen Maschine und load balancing Server. Was auch immer nutzen-Sie glauben, Sie bekommen aus, trennen Sie Sie wahrscheinlich nicht Wert, die zusätzliche Probleme.
Den
location ~ \.php$
block erfordert eine try_files zu prüfen, ob Datei-Existenz. Wenn der nicht vorhanden ist, geben 404 zurück, und Ihre error404.php wird es dauern.mydomain.co.uk/someNonExistantFile
, die nicht mit beliebigen Lage blockiert?Ihre "root /var/www/xxxxxx;" sollte sein außerhalb der "location ~ .php$" - block und vor "error_page 404 = /error404.php;"
Wenn Sie sich immer noch nicht die gewünschten 404-Seite aus error404.php ich schlage vor, Sie beginnen, Debuggen, indem eine standard-Kopie von nginx.conf und dann Brauch Eure error_page von dort aus, weil das, was wir vorgeschlagen funktioniert. Ich habe die gleichen Einstellungen für meine eigenen server.
Wenn es immer noch nicht funktioniert, es sollte ein upstream-Problem.
Möchten Sie auch überprüfen Sie Ihre
include /etc/nginx/fastcgi.conf;
include fastcgi_params;
zu sehen, ob es irgendwelche Schurken Variablen. Es gibt vielleicht einige doppelte Variablen gibt.
Faustregel debugging. Reduzieren Sie Ihre Variablen. Beginnen Sie mit einer einfachen Konfiguration und arbeiten Sie Ihren Weg bis zu maßgeschneiderten it.
error_page 404 = /error404.php;
und es hat nicht einen Unterschied machen. Wir haben auch andere location-Blöcke enthalten, die nicht in der obigen Schnipsel, die statische Dateien, Bilder, css, etc., die Last direkt vom Nginx-Maschine. Die PHP-FPM-Instanzen sind, die sich physisch auf anderen Computern. Die Nginx-Maschinen haben nicht die php-Dateien auf Ihnen, die ich denke, ist, warum es nicht glaube, Sie kann es finden. Ich werde meine fastcgi_params und fastcgi.conf, um die Haupt-Frage, aber ich denke, Sie sind ok, da alles andere funktioniertDen richtigen Weg
error_page 404 /path/to/404.php;
Ich weiß, dass es funktioniert, weil ich baute eine Anwendung vor kurzem und das war das setup für die Fehlerbehandlung. bitte beachten Sie, i verwenden Sie url-rewriting zu entfernen
index.php
von Anforderungen für jedes Verzeichnis. Auf diese Weise können Sie Ihre setup-Fehler, Skript-log-Informationen zu Ihrer Datenbank, die nützlich sein können für schwierig zu Debuggen von ajax-Fehler, unter anderem: