Vraag Hoe werkt try_files?


Ik keek naar de documentatie van nginx en het verwart me nog steeds volkomen.

Hoe werkt het try_files werk? Hier is wat de documentatie zegt:

Van NginxHttpCoreModule

try_files

syntaxis: try_files path1 [path2] uri

standaard: geen

context: server, locatie

beschikbaarheid: 0.7.27

Controleert het bestaan ​​van bestanden in volgorde en retourneert het eerste bestand   dat is gevonden. Een trailing slash geeft een directory aan - $ uri /. In de   gebeurtenis dat er geen bestand is gevonden, een interne omleiding naar de laatste   parameter wordt aangeroepen. De laatste parameter is de fallback-URI en    moet bestaan, anders wordt er een interne fout gemaakt. In tegenstelling tot herschrijven, worden $ args niet automatisch bewaard als de fallback dat niet is   een benoemde locatie. Als je args bewaard moet hebben, moet je dat doen   uitdrukkelijk:

Ik begrijp niet hoe het de paden controleert en wat als ik geen interne fout wil, maar de rest van het pad wil hervatten in een poging om een ​​ander bestand te vinden?

Als ik een in cache opgeslagen bestand wil proberen op /path/app/cache/url/index.html en als het niet lukt /path/app/index.php hoe zou ik dat schrijven? Als ik schreef:

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;

ik heb index index.php index.html index.htm;. Wanneer ik bezoek /urlname, zal het proberen te controleren /path/app/cache/urlname/index.php dan /path/app/cache/urlname/index.html? Als we alles daarna negeren try_files is het mogelijk voor try_files om de cachemap te controleren? Ik heb geprobeerd en gefaald.


49
2017-11-10 03:46


oorsprong




antwoorden:


try_files probeert het letterlijke pad dat u opgeeft in relatie tot de gedefinieerde rootrichtlijn en stelt de interne bestandspointer in. Als je bijvoorbeeld gebruikt try_files /app/cache/ $uri @fallback; met index index.php index.html; dan zal het de paden in deze volgorde testen:

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

voordat uiteindelijk intern wordt doorgestuurd naar de locatie genaamd @fallback met de naam. U kunt ook een bestand of een statuscode gebruiken (=404) als uw laatste parameter maar als u een bestand gebruikt moet bestaan.

Houd er rekening mee dat try_files zelf geen interne omleiding zal afgeven voor alles behalve de laatste parameter. Dit betekent dat je niet het volgende kunt doen: try_files $uri /cache.php @fallback; omdat dat ervoor zorgt dat nginx de interne bestandspointer op $ document_root / cache.php zet en serveert, maar omdat er geen interne omleiding plaatsvindt, worden de locaties niet opnieuw geëvalueerd en worden ze als zodanig als platte tekst weergegeven. (De reden dat het werkt met PHP-bestanden aangezien de index de indexrichtlijn is zullen een interne omleiding uitbrengen)


50
2017-11-11 01:27



Dat is VEEL duidelijker. Bedankt. Ik ben een beetje onzeker hoe de genoemde locatie werkt. Als @fallback regels heeft voor fastcgi php die het als een php-bestand zouden dienen in plaats van tekst? Wordt fallback gebruikt als alles voordat het faalt?
Een benoemde locatie is gewoon functioneel identiek aan een normale locatie, behalve dat deze alleen toegankelijk is via interne mechanismen zoals error_page en try_files. De fallback in try_files wordt alleen gebruikt als geen van de opgegeven paden resulteert in een geldig bestand. Je hebt nog steeds een locatie nodig om \ .php $ URI's te vangen, omdat anders try_files op $ uri wordt geactiveerd als het bestand bestaat en als onbewerkte tekst wordt weergegeven. - Martin Fjordvald
Bedankt voor dit antwoord .. Ik heb hier nog steeds een vraag: wordt try_files meteen uitgevoerd of wordt er eerder een locatie genest? - Stphane
@Stphane Je gaat hier naar troebele wateren. Overerving in nginx is complex, rommelig en volledig inconsistent. Ik moest mijn oude aantekeningen bekijken om dit te onthouden, dus geen garanties, maar het lijkt erop dat try_files, met name wanneer het alleen om geneste locaties gaat, niet wordt uitgevoerd als de binnenlocatie overeenkomt. Ik zou echter aanraden het te testen. - Martin Fjordvald


Hier is nog een handig gebruik van try_files, als onvoorwaardelijke omleidingen naar benoemde locaties. De genoemde locaties werken effectief als subroutines, waardoor duplicatie van code wordt bespaard. Wanneer het eerste argument voor try_files "_" is, wordt altijd de fallback-omleiding gebruikt.

    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