Ich konfiguriere derzeit die Behandlung einiger Fehlerseiten und anderer "Standard" -Datendateien (wie favicon.ico und robots.txt) durch nginx und habe ein kleines Problem damit, dass die Dinge für bestimmte Fehlerseiten so funktionieren, wie ich es möchte .
Grundsätzlich versuche ich, bestimmte Dateien für einen Server unter dem Stammverzeichnis für diesen Server bereitzustellen, z. B. /var/www/someserver.com/robots.txt. Wenn diese Datei nicht vorhanden ist, möchte ich, dass nginx zum "Standard" wechselt, dh /var/www/default/robots.txt. Dies ist der Grundgedanke, wie ich das (erfolgreich) konfiguriert habe:
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Das funktioniert super.
Ich versuche, dasselbe für Fehlerseiten zu tun, und ich kann dies jedoch nicht erreichen:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Beachten Sie, dass dies in dem Sinne "funktioniert", dass beim Besuch von someserver.com/404.html zunächst versucht wird, /var/www/someserver.com/404.html zu laden, und dann auf / var / www / default zurückgegriffen wird /404.html wenn das nicht gefunden wird. Wenn Sie jedoch someserver.com/blahblah besuchen, wird die 404-Seite nur angezeigt, wenn sie in /var/www/someserver.com/ festgelegt ist. Es wird nicht auf das Standardverzeichnis zurückgegriffen, wenn diese Datei nicht vorhanden ist.
Wie auch immer, Sie können wahrscheinlich das erreichen, was ich erreichen wollte (deshalb habe ich das erste Arbeitsbeispiel beigefügt).
Irgendwelche Ideen?
Bearbeiten:
Basierend auf der Antwort von Martin F habe ich Folgendes zusammengestellt:
# 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;
}
}
Das funktioniert super. Der eigentliche Block der oben genannten error_pages und Speicherorte befindet sich in einer server_defaults.conf-Datei, die in jedem virtuellen Host enthalten ist. Aus diesem Grund habe ich den Pfad nicht fest in jeden Speicherort codiert und einen relativen Pfad für die Standardwerte verwendet.
Bearbeiten 2:
Dieser Ansatz hat ein Problem. Wenn Sie an eine URL POSTEN, die einen Fehler zurückgibt, wird die POST-Anforderungsmethode mit den Versuchen try_files gesendet. Dies führt (für mich) zu einem 405 Not Allowed-Fehler, da nginx im Wesentlichen versucht, POST an z. B. /default/500.html zu senden, anstatt nur diese Seite abzurufen.
Edit 3:
Ich habe eine Lösung veröffentlicht, die meiner ursprünglichen Idee viel näher kommt.
log_not_found off;
Sieinternal;
stattdessen entfernen und hinzufügen .try_files ist der richtige Weg hierher. Die folgende Konfiguration sollte funktionieren, aber ich habe sie nicht auf Syntaxfehler getestet.
quelle
Leider bin ich ein paar Jahre zu spät mit meiner Antwort, aber ich dachte, es könnte den zukünftigen Suchenden helfen. Meine installierte Nginx-Version ist 1.2.4 und ich habe das folgende Konfigurations-Snippet erstellt:
quelle
internal
.Ich fand es entscheidend, "proxy_intercept_errors on" einzuschließen. in jedem Standortblock, in dem auch error_page enthalten war.
Ohne diese Einstellung fängt der Standortblock Fehlercodes ab, die vom Upstream zurückkommen.
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
quelle