Try_files nasıl çalışır?


72

Nginx belgelerine baktım ve hala beni tamamen şaşırtıyor.

Nasıl try_filesçalışır? İşte belgeler ne diyor:

NginxHttpCoreModule Gönderen

try_files

sözdizimi: try_files path1 [path2] uri

varsayılan: yok

bağlam: sunucu, konum

kullanılabilirlik: 0.7.27

Dosyaların varlığını sırayla denetler ve bulunan ilk dosyayı döndürür. Sondaki eğik çizgi bir dizini gösterir - $ uri /. Hiçbir dosya bulunamaması durumunda, son parametreye dahili bir yönlendirme çağrılır. Son parametre geri dönüş URI'sidir ve var olması gerekir , aksi takdirde dahili bir hata ortaya çıkar. Yeniden yazma işleminden farklı olarak, geri dönüş adlandırılmış bir konum değilse, $ args otomatik olarak korunmaz. Eğer korumaya ihtiyacınız varsa, bunu açıkça yapmanız gerekir:

Yolları nasıl kontrol ettiğini anlamıyorum ve dahili bir hata istemiyorsam ancak başka bir dosyayı bulmak için yolun kalanını devam ettirirse ne olur?

Önbelleğe alınmış bir dosyayı denemek istersem /path/app/cache/url/index.htmlve denemezse /path/app/index.phpnasıl yazarım? Yazdıysam:

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;

Benim var index index.php index.html index.htm;. Ben ziyaret ettiğinizde /urlname, bu kontrol çalışacağız /path/app/cache/urlname/index.phpsonra /path/app/cache/urlname/index.html? Her şeyi görmezden gelirsek , önbellek klasörünü kontrol etmek try_filesmümkün müdür try_files? Denedim ve başarısız oldum.

Yanıtlar:


64

try_files, tanımlanmış kök yönergesiyle ilgili olarak belirlediğiniz değişmez yolu dener ve dahili dosya işaretçisini ayarlar. Örneğin try_files /app/cache/ $uri @fallback;birlikte kullanıyorsanız index index.php index.html;, yolları bu sırayla test eder:

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

önce nihayet dahili olarak konum adı @fallback'e yönlendiriliyordu. Bir dosyayı veya bir durum kodunu ( =404) en son parametreniz olarak da kullanabilirsiniz, ancak bir dosya kullanıyorsanız bu dosya mevcut olmalıdır .

Try_files öğesinin kendisinin son parametreden başka hiçbir şey için dahili yönlendirme yapmayacağını unutmayın. Yani, aşağıdakileri yapamazsınız: try_files $uri /cache.php @fallback;bu, nginx'in dahili dosya göstericisini $ document_root / cache.php olarak ayarlamasına ve sunmasına neden olacak ve hizmet edecek, ancak hiçbir iç yönlendirme olmadığından, konumlar yeniden değerlendirilmez ve düz metin olarak görev yaptı. (Bu endeks olarak PHP dosyaları ile çalışır nedeni endeksi direktifi olmasıdır edecek bir iç yönlendirme sorunu)


2
Bu çok daha açık. Teşekkürler. Belirtilen konumun nasıl çalıştığından emin değilim. @Fallback fastcgi php için satırlar içeriyorsa, o zaman metin yerine php dosyası olarak işlev görür. Geri dönüş her şey başarısız olduğunda kullanılır mı?

2
Adlandırılmış bir konum, yalnızca error_page ve try_files gibi dahili mekanizmalar yoluyla erişilebilmesi dışında normal bir konumla işlevsel olarak aynıdır. Try_files içindeki geri dönüş, yalnızca belirtilen yollardan hiçbiri geçerli bir dosyaya neden olmadığında kullanılır. \ .Php $ URI'leri yakalamak için hala bir konuma ihtiyacınız var, aksi takdirde try_files $ uri'da tetikler ve eğer dosya varsa ve düz metin olarak sunulur.
Martin Fjordvald

Bu cevap için teşekkür ederim .. Burada hala bir sorum var: try_files hemen çalıştırılıyor mu yoksa iç içe konum daha önce denenecek mi?
Stphane

@Stphane Burada bulanık sulara doğru ilerliyorsunuz. Nginx'te kalıtım, karmaşık, dağınık ve tamamen tutarsız. Bunu hatırlamak için eski notlarımı gözden geçirmem gerekti, bu yüzden hiçbir garanti vermedim, ama sanırım try_files için, özellikle sadece iç içe konumlarla uğraşırken, iç konum eşleşirse yürütülmeyecek gibi görünüyor. Yine de test etmenizi öneririm.
Martin Fjordvald

5

İşte try_files'ın isimlendirilmiş konumlara koşulsuz yönlendirmeleri olarak uygun bir şekilde kullanılması. Belirtilen konumlar, alt kodlar gibi etkili bir şekilde hareket eder ve kod çoğaltılmasını önler. Try_files işlevinin ilk argümanı "_" olduğunda, geri dönüş yönlendirmesi her zaman alınır.

    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;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.