bitlvl
SR

Tester nginx location blokova

nginx bira location po pravilima koja se lako pogrešno zapamte, a uobičajen način da saznate je da deploy-ujete i pokrenete curl. Umesto toga nalepite svoju konfiguraciju i URL: trag prikazuje svaku razmatranu location, zašto je pobedila ili izgubila, i šta se dešava dalje.

Ništa se nikuda ne šalje; podudaranje se izvršava u vašem pregledaču.

Rezultati i poruke ovog alata prikazuju se na engleskom.

Kako nginx bira location

  1. URI se prvo normalizuje: procentno dekodiranje, spajanje ponovljenih kosih crta, razrešavanje . i ... Query string nikada nije deo podudaranja location blokova.
  2. Porede se sve prefiksne location (bez modifikatora, =, ^~). Tačno podudaranje = pobeđuje odmah. Inače se pamti najduži podudarni prefiks.
  3. Ako taj najduži prefiks ima ^~, on pobeđuje i regex-i se preskaču.
  4. 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.
  5. Ako se nijedan regex ne poklopi, koristi se zapamćeni najduži prefiks.
  6. 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

ZastavicaEfekat
lastprekida obradu rewrite pravila, ponovo pokreće podudaranje location blokova sa novim URI-jem (najviše 10 puta, zatim 500)
breakprekida 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.