Frage Wie funktioniert try_files?


Ich schaute auf die Nginx-Dokumentation und es verwirrt mich immer noch völlig.

Wie geht es? try_files Arbeit? Hier ist, was die Dokumentation sagt:

Von NginxHttpCoreModule

try_files

Syntax: try_files Pfad1 [Pfad2] uri

Standard: keine

Kontext: Server, Standort

Verfügbarkeit: 0.7.27

Prüft das Vorhandensein von Dateien in der richtigen Reihenfolge und gibt die erste Datei zurück   das ist gefunden. Ein abschließender Schrägstrich zeigt ein Verzeichnis an - $ uri /. In dem   Event, dass keine Datei gefunden wird, eine interne Weiterleitung an die letzte   Parameter wird aufgerufen. Der letzte Parameter ist der Fallback-URI und    Muss existiert, oder sonst wird ein interner Fehler ausgelöst. Im Gegensatz zum Neuschreiben werden $ Args nicht automatisch beibehalten, wenn das Fallback nicht ist   ein benannter Ort Wenn Sie Arcs beibehalten müssen, müssen Sie dies tun   ausdrücklich:

Ich verstehe nicht, wie es die Pfade überprüft und was, wenn ich keinen internen Fehler möchte, aber habe ich den Rest des Pfades wieder aufgenommen, um eine andere Datei zu finden?

Wenn ich eine zwischengespeicherte Datei an versuchen möchte /path/app/cache/url/index.html und wenn es nicht versucht /path/app/index.php Wie würde ich das schreiben? Wenn ich schrieb:

try_files /path/app/cache/ $uri
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;

ich habe index index.php index.html index.htm;. Wenn ich besuche /urlname, wird es versuchen, zu überprüfen /path/app/cache/urlname/index.php dann /path/app/cache/urlname/index.html? Wenn wir alles danach ignorieren try_files ist es möglich für try_files den Cache-Ordner überprüfen? Ich habe es versucht und versagt.


49
2017-11-10 03:46


Ursprung




Antworten:


try_files testet den angegebenen literalen Pfad in Bezug auf die definierte root-Direktive und setzt den internen Dateizeiger. Wenn Sie zum Beispiel verwenden try_files /app/cache/ $uri @fallback; mit index index.php index.html; dann wird es die Pfade in dieser Reihenfolge testen:

  1. $document_root/app/cache/index.php 
  2. $document_root/app/cache/index.html 
  3. $document_root$uri 

bevor schließlich intern auf den @fallback genannten Ort umgeleitet wird. Sie können auch eine Datei oder einen Statuscode (=404) als Ihr letzter Parameter, aber wenn Sie eine Datei verwenden muss existieren.

Sie sollten beachten, dass try_files selbst keine interne Weiterleitung für irgendeinen anderen als den letzten Parameter ausgibt. Das bedeutet, dass Sie Folgendes nicht tun können: try_files $uri /cache.php @fallback; da dies bewirkt, dass nginx den internen Dateizeiger auf $ document_root / cache.php setzt und ihn bedient, aber da keine interne Weiterleitung stattfindet, werden die Orte nicht neu bewertet und als solche wird sie als reiner Text geliefert. (Der Grund, warum es mit PHP-Dateien als Index funktioniert, ist die index-Direktive werden Ausgabe einer internen Weiterleitung)


50
2017-11-11 01:27



Das ist viel klarer. Vielen Dank. Ich bin ein wenig unsicher, wie der benannte Ort funktioniert. Wenn @fallback Zeilen für fastcgi php hat, die es als PHP-Datei anstatt als Text dienen würden? Wird Fallback verwendet, wenn alles vorher fehlschlägt?
Ein benannter Ort ist nur funktional identisch mit einem normalen Ort, außer dass er nur über interne Mechanismen wie error_page und try_files erreichbar ist. Der Fallback in try_files wird nur verwendet, wenn keiner der angegebenen Pfade zu einer gültigen Datei führt. Sie benötigen immer noch einen Ort, an dem \ .php $ URIs abgefangen werden können, da sonst try_files auf $ uri triggert, wenn die Datei existiert und sie als Klartext dient. - Martin Fjordvald
Vielen Dank für diese Antwort. Ich habe noch eine Frage: Wird try_files sofort ausgeführt oder wird der verschachtelte Standort vorher getestet? - Stphane
@ Stphane Du bewegst dich hier in trübe Gewässer. Vererbung in nginx ist komplex, chaotisch und völlig inkonsistent. Ich musste meine alten Notizen überprüfen, nur um mich daran zu erinnern, also keine Garantien, aber es scheint, dass für try_files, insbesondere wenn es nur verschachtelte Orte betrifft, nicht ausgeführt wird, wenn der innere Ort übereinstimmt. Ich würde jedoch empfehlen, es zu testen. - Martin Fjordvald


Hier ist eine weitere bequeme Verwendung von try_files als bedingungslose Weiterleitung an benannte Orte. Die benannten Orte fungieren effektiv als Unterroutinen, wodurch Duplizierung von Code gespart wird. Wenn das erste Argument für try_files "_" ist, wird immer die Fallback-Weiterleitung verwendet.

    location =/wp-login.php { try_files _ @adminlock; }
    location ^~ /wp-admin/  { try_files _ @adminlock; }
    location @adminlock  {
            allow 544.23.310.198;
            deny all;
            try_files _ @backend;
            # wp-admin traffic is tiny so ok to send all reqs to backend 
    }
    location ~ \.php {  try_files _ @backend; }
    location / { try_files $uri $uri/ =403; }
    location @backend {
            fastcgi_pass 127.0.0.1:9000;
            include snippets/fastcgi-php.conf;
    }

1
2018-03-02 04:26