nginx; return response-code, wenn eine Datei vorhanden ist, mit try_files nur
Seit IfIsEvil ich habe, die versuchen, eine Konfiguration mit der Richtlinie try_files
nur so, dass eine Wartung der Seite angezeigt, zusammen mit dem response-code 503, für jeden URI ohne Ausnahme, also auch für php-Seiten, wenn eine IH-Datei vorhanden ist.
Gibt es zwei Probleme mit meiner Konfiguration:
- Die Wartung der Seite nicht angezeigt für php-URIs.
- Den response-code 503 wird nicht zurückgegeben, wenn die maintenance.html Datei existiert.
Ich habe gesehen, ähnliche Fragen [1],[2] aber keines mit einer Lösung, die verwendet try_files
nur (anders als die mit der if
- Richtlinie) und die, die bedingungslos dient ein Wartungs-Seite mit den response-code 503, wenn die entsprechende Datei vorhanden ist. Ist solch eine Lösung möglich?
Unten ist meine aktuelle nicht funktionierende conf-Datei. Es enthält nicht eine 503-Antwort-code festlegen, weil ich nicht verstehe, wo es soll gehen, um für Sie zu arbeiten, wie oben beschrieben.
worker_processes 1;
error_log /var/log/nginx/error.log debug;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
index index.php index.html index.htm;
server {
listen 80;
server_name rpi;
root /www;
location /{
try_files /maintenance.html $uri $uri//index.php?$args;
# pass the PHP scripts to FastCGI server
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
}
}
Ich denke, dass meine Frage könnte alternativ so formuliert werden, wie diese: Kann try_files
gemacht werden, um zu arbeiten, wie ein if
Kontrollstruktur? Wenn nicht von selbst, kann es, mit dem Ziel, zusammen mit anderen Richtlinien zu handeln, ohne die if
Richtlinie?
edit: Unten ist eine Lösung mit if
ich bin derzeit mit, indem Sie ihn in den server-Abschnitt:
error_page 503 @maintenance;
if (-f $document_root/maintenance.html) {
return 503;
}
location @maintenance {
try_files /maintenance.html =404;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehr gute Frage! Aber es ist gar nicht möglich, es sei denn, Sie nennen eine Art von Skript, das setzt die richtigen response-code.
Eine funktionierende Lösung, die nur mit nginx und Nein, wenn
Den
try_files
- Direktive ist nur das durchführen einer internen Umleitung für die Letzte Aussage. Aber wir können verbinden Sie es mit demindex
- Direktive und zwingen einen internen redirect.Irgendwelche Nachteile bei dieser Methode?
expires epoch
um die Lage zu blockieren.Andere Lösungen?
Via nginx-Konfiguration-Datei
Erstellen, anstatt eine HTML-Datei ist, warum nicht erstellen Sie eine nginx-Konfiguration-Datei und laden Sie einfach den Prozess?
Den nginx-Konfiguration könnte wie folgt Aussehen (beachten Sie, dass diese
if
ist nicht böse an alle):Inhalt der
maintenance.conf
Datei:Und wenn Sie wollen, aktivieren Sie den Wartungsmodus (in der shell):
Fortgeschrittene für shell-Freunde
Man könnte sogar verlängern ein init-Skript mit diesem, zum Beispiel meine LSB-konform ein durch den Austausch des folgenden block am Ende der Datei:
Mit den folgenden block:
Und jetzt können Sie einfach führen Sie den folgenden Befehl (einschließlich der auto-Vervollständigung), um in den Wartungsmodus gehen:
Oder die folgenden zu gehen zurück in die Produktion:
Mit einem script /PHP-Datei
Anderen extrem einfach Ansatz wäre wie ein Zauber funktioniert, ist die Verwendung einer PHP-Datei, verarbeitet Sie es.
Ihre PHP-Datei Aussehen würde, genau wie deine HTML-Datei, müssen Sie nur fügen Sie den folgenden, um die es zu Beginn (vorausgesetzt PHP 5.4+):