nginx'in hangi location'ı seçtiğini nasıl anlarım?
Yapılandırmayı ve isteğin URI'sini bu test aracına yapıştırın; kazanan bloğu ve diğer her bloğun neden elendiğini görün. Çalışan bir sunucuda error_log /var/log/nginx/debug.log debug; satırını ekleyin ve seçilen location'ı adıyla veren "using configuration" satırını arayın. İki yaklaşım farklı sorulara cevap verir: günlük, canlı bir sunucunun ne yaptığını söyler; bu sayfa ise henüz yayına almadığınız bir yapılandırmanın ne yapacağını söyler.
nginx location düzenli ifadem neden çalışmıyor?
Genellikle üç nedenden biri yüzünden ve karar tablosu hangisi olduğunu söyler. Daha önceki bir düzenli ifade zaten eşleşmiştir, dolayısıyla sizinki hiç çalışmamıştır — düzenli ifadeler dosya sırasıyla denenir ve ilk eşleşme kazanır. Ya da en uzun eşleşen önek ^~ taşıyordur ve düzenli ifade aşaması tümüyle atlanmıştır. Ya da düzenli ifade doğrudur ama URI sandığınız gibi değildir: eşleşme, yüzde kodlaması çözülmüş ve .. işlenmiş, sorgu dizesi çıkarılmış normalleştirilmiş yol üzerinde çalışır.
Tam eşleşmem neden tetiklenmiyor?
= ile yazılan bir location, URI'nin desenle başlamasını değil, tamamının eşit olmasını ister. location = /a/, /a ile eşleşmez ve location = /a, /a/b ile eşleşmez. Sondaki eğik çizgiler burada sıradan karakterlerdir, dolayısıyla iki biçim farklı dizelerdir. Tam eşleşen bir location bulunduğunda arama anında durur ve geri kalan hiçbir şey karşılaştırılmaz bile.
nginx bir location bloğunda sorgu dizesini eşleştirir mi?
Hayır. Sorgu dizesi normalleştirme sırasında ayrılır ve location seçimi yalnızca yol üzerinde çalışır. location = /a ifadesinin /a?x=/b isteğiyle eşleşmesinin nedeni budur. Bir parametreye göre dallanmanız gerekiyorsa blok içinde $arg_name ya da $args değerini okumalısınız. Bilmeye değer bir incelik: %3F yolda kalan gerçek bir soru işaretine çözülür, dolayısıyla /a%3Fx=1 adresinin sorgu dizesi boştur ve yolunda ? vardır.
nginx location içinde JavaScript düzenli ifade sözdizimi kullanabilir miyim?
Hayır — nginx PCRE kullanır ve aradaki farklar önemlidir. Bu sayfa yalnızca ECMAScript düzenli ifadelerinin bulunduğu tarayıcınızda çalışır, bu yüzden yalnızca PCRE'de olan yapılar sessizce yanlış değerlendirilmek yerine saptanıp işaretlenir: atomik gruplar, iyelik niceleyicileri, (?i) gibi satır içi değiştiriciler, [[:alpha:]] gibi POSIX sınıfları ve JavaScript'in sessizce sıradan harf olarak okuduğu \A ile \K gibi kaçış dizileri. Bir location işaretlendiğinde kalan adaylar yine nginx'in sırasıyla değerlendirilir, ama o bloğun kararının gerçek bir sunucuda denetlenmesi gerekir. Desenin kendisini yazıyorsanız düzenli ifade test aracı ECMAScript sözdizimini ayrıntısıyla ele alır. nginx location önek eşleşmeleri büyük/küçük harfe duyarlı mı?
Linux'ta evet — location /Static/, /static/x ile eşleşmez. macOS ve Cygwin gibi büyük/küçük harfe duyarsız dosya sistemlerinde nginx önekleri harf durumuna bakmadan karşılaştırır ve ayrıca her düzenli ifade location'ını ~* gibi davranmaya zorlar. Bu sayfa, üretim sunucularının neredeyse her zaman çalıştırdığı Linux davranışını modeller. Mac üzerinde geliştirip Linux'a dağıtıyorsanız bu fark, bozuk bir kuralı yayına çıkana dek gizleyebilir.
try_files hangi location bloğunun seçildiğini değiştirir mi?
Hayır. Location seçimi önce biter; try_files sonra, zaten kazanmış olan bloğun içinde çalışır. Bir istek try_files yazdığınız bloğa hiç ulaşmıyorsa yönerge önemsizdir — alışılmış neden, yedeği taşıyan önek bloğu iş yapamadan isteği alan bir ~ \.php$ düzenli ifadesidir. Sonradan verilen bir iç yönlendirme ise eşleşmeyi yeniden başlatır, dolayısıyla yeniden yazılmış bir URI location listesine baştan tekrar sokulur.
Eğik çizgisiz bir dizin istediğimde nginx neden 301 döndürüyor?
Bunu iki farklı mekanizma üretir. Adı / ile biten bir location proxy_pass ya da başka bir *_pass yönergesi taşıyorsa, aynı yola eğik çizgisiz gelen istek, herhangi bir düzenli ifade değerlendirilmeden önce, location seçimi sırasında 301 ile yanıtlanır. Bundan ayrı olarak statik dosya modülü, yol diskteki gerçek bir dizine çözüldüğünde 301 verir. Birincisi burada görünür; ikincisi dosya sisteminize bağlıdır. location = /path eklemek birincisini bastırır.
İç içe location blokları sonucu değiştirir mi?
Evet ve gözden kaçması kolay bir biçimde. nginx kazanan önek location'ının içine iner ve çocuklarını arar, dolayısıyla iç içe bir düzenli ifade üst düzeydeki düzenli ifadelerden önce denenir. Dıştaki bloğun ^~ taşıması onu kendi içindeki düzenli ifadelerden korumaz ve dış düzeydeki bir kardeş önce kazandığında iç içelik, genel olarak daha uzun bir öneki ulaşılamaz kılabilir. İç içe bloklar burada, yazdığınız girintinin aynısıyla modellenir.
nginx yapılandırmam bir yere yükleniyor mu?
Hayır. Ayrıştırma ve eşleştirme, düz dize işlemleriyle tarayıcınızda yerel olarak yapılır — sunucu çağrısı yoktur ve hiçbir şey saklanmaz. Bu, çoğu araçtan daha çok burada önem taşır, çünkü gerçek bir server bloğu upstream sunucu adları, iç portlar, sertifika yolları ve yetkilendirme kuralları içerir. Sözümüze güvenmek zorunda değilsiniz: tarayıcınızın geliştirici araçlarını açın ve siz yazarken Network panelinin sessiz kaldığını izleyin ya da bağlantıyı tümüyle kesip test etmeye devam edin. Hiçbir dış isteğin bulunmadığı, her yapımda çalışan otomatik bir sözleşme testiyle de güvence altına alınır, dolayısıyla sessizce geri gidemez.