Kako nginx bira location
- URI se prvo normalizuje: procentno dekodiranje, spajanje ponovljenih kosih crta, razrešavanje
.i... Query string nikada nije deo podudaranja location blokova. - Porede se sve prefiksne location (bez modifikatora,
=,^~). Tačno podudaranje=pobeđuje odmah. Inače se pamti najduži podudarni prefiks. - Ako taj najduži prefiks ima
^~, on pobeđuje i regex-i se preskaču. - Regex location (
~osetljivo na velika i mala slova,~*neosetljivo) se proveravaju redosledom kojim se pojavljuju u datoteci. Prvo podudaranje pobeđuje, čak i ako se ranije poklopio duži prefiks. - Ako se nijedan regex ne poklopi, koristi se zapamćeni najduži prefiks.
- Unutar pobedničke location isti postupak se ponavlja za ugnežđene location blokove.
Dve posledice najviše iznenađuju: obična location /images/ gubi od location ~ \.png$ za /images/a.png, jer se regex-i proveravaju posle prefiksa; a location /api odgovara i za /apiary, jer su prefiksi prefiksi stringa, a ne segmenti putanje. Koristite /api/ ili ^~ kada to zaista mislite.
proxy_pass i završna kosa crta
Ako proxy_pass ima URI deo (bilo šta posle hosta, makar samo /), nginx njime zamenjuje deo URI-ja zahteva koji se poklopio sa prefiksom location bloka. location /api/ { proxy_pass http://app/; } pretvara /api/users u /users. Bez URI dela, URI zahteva prolazi nepromenjen. Neusklađene kose crte (/api naspram /api/, ili http://app naspram http://app/) daju //users ili users — tester ispisuje tačan upstream URI da biste to videli. URI deo nije dozvoljen u regex location osim ako rewrite prethodno nije promenio URI.
root naspram alias
root dodaje ceo URI na direktorijum: root /srv; location /static/ servira /srv/static/x.css. alias zamenjuje prefiks location bloka: alias /srv/assets/; location /static/ servira /srv/assets/x.css. Kod alias-a završne kose crte location bloka i alias-a moraju da se slažu, a u regex location alias mora da koristi grupe za hvatanje.
rewrite zastavice
| Zastavica | Efekat |
|---|---|
| last | prekida obradu rewrite pravila, ponovo pokreće podudaranje location blokova sa novim URI-jem (najviše 10 puta, zatim 500) |
| break | prekida rewrite pravila, ostaje u trenutnoj location sa novim URI-jem |
| redirect | šalje 302 klijentu |
| permanent | šalje 301 klijentu |
| (nema) | nastavlja sa sledećim rewrite pravilom; na nivou servera rezultat se zatim poredi sa location blokovima |
try_files
Svaki argument se proverava kao datoteka (ili direktorijum, sa završnom kosom crtom) relativno u odnosu na root/alias; prvi koji postoji se servira. Poslednji argument je rezervna opcija i ne proverava se: to je interno preusmerenje na URI (koji ponovo prolazi kroz podudaranje location blokova), imenovana location @ime, ili statusni kod u stilu =404. Tester ne vidi vaš sistem datoteka, pa nabraja putanje koje bi bile proverene.
Nasleđivanje add_header
add_header se nasleđuje sa nivoa servera samo kada location nema sopstveni add_header. Jedan add_header Cache-Control u location bloku tiho uklanja bezbednosna zaglavlja postavljena na nivou servera. Trag to označava.
Pitanja
Da li podržava punu sintaksu nginx konfiguracije?
Parser obrađuje stvarnu sintaksu: ugnežđene blokove, komentare, stringove pod navodnicima, regex argumente; include direktive se navode, ali se ne prate (nalepite i uključenu datoteku). Promenljive osim $uri, $request_uri, $args i regex grupa za hvatanje ostaju kao tekst, a „if“ blokovi se prikazuju, ali ne procenjuju.
Zašto se moj regex ponaša drugačije u nginx-u?
nginx koristi PCRE; ova stranica koristi JavaScript regularne izraze. Slažu se oko gotovo svega što se koristi u location blokovima, ali posesivni kvantifikatori, rekurzija i neki oblici lookbehind-a se razlikuju. Trag kaže kada regex nije mogao da se kompajlira.
Može li da proveri koji server blok odgovara za neki Host?
Da. Nalepite više server blokova i popunite polje Host. Izbor prati nginx: tačno ime, najduži džoker koji počinje sa *, najduži džoker koji se završava sa *, prvi podudarni regex, zatim default_server, pa prvi server za taj port.
Kako da testiram na pravom serveru?
nginx -T ispisuje celu spojenu konfiguraciju (svi include-ovi razrešeni) koju možete nalepiti ovde. Za proveru uživo, curl -sI -H "Host: example.com" http://127.0.0.1/putanja i pročitajte odgovor; privremeno dodajte add_header X-Debug-Location "$uri" ako treba da vidite koji je blok odgovorio.