Nginx - matchování location

Nginx - matchování location
« kdy: 06. 10. 2022, 12:44:28 »
Zaráží mě, že v sites-enabled/tato.conf musím mít

Kód: [Vybrat]
(1)
       location /Data/mounted/upload {
autoindex on ;
        root /bla;
#nepomohlo ani
break ;
}

#(2)
        location ~ ^(/Data(?!/mounted/upl)|/index2.php|/img|/forum)   {

(3)
#nestačí:
        location ~ ^(/Data|/index2.php|/img|/forum)   {

Varianta 2 místo 3 mi logicky háže chybu pro adresy /Data/mounted, jelikož v obou direktivách location toho mám "víc", různé backendy


Jak funguje matchování location? MAtchnou se obě (1) a (2) protože vyhovují?
Je nějaké řešení, jak docílit chování (1)+(3), aniž bych musel zanášet (3) duplicitním negative lookahead patternem?

Něco aby když se matchne první location, se už dál nepokračovalo?

A na to navazuje další dotaz, if se zpracovává sekvenčně?  Nebo nějak podivně? Protože se od něj odrazuje a dokonce prý může způsobovat segfault nebo neočávané chování.
Včemtkví zvláštnost a nebezpečí if? Nebo je ho bezpečné používat mimo location


Závisí vlastně na pořadí location?(tipuji že ne)
Závisí vlastně na pořadí if?(odpozorováno že ano)



Re:Nginx - matchování location
« Odpověď #1 kdy: 06. 10. 2022, 13:33:34 »
Ano, zalezi na poradi location, pokud maji regulary. Pokud jsou jen staticke, tak na poradi nezalezi. A pokud jsou staticke i regulary, tak prednost ma regular pred statikou. Presne poradi lze dohledat na google.

If is evil.

Re:Nginx - matchování location
« Odpověď #2 kdy: 06. 10. 2022, 16:03:28 »
WTF, takže statiku location /Data/mounted musím přepsat na location ~ /Data/mounted ... te gdo to vymyslel musel být geniál

Re:Nginx - matchování location
« Odpověď #3 kdy: 06. 10. 2022, 16:20:23 »
WTF, takže statiku location /Data/mounted musím přepsat na location ~ /Data/mounted ... te gdo to vymyslel musel být geniál
Jak byste to udělal jinak? Statické vzory je možné programově seřadit tak, že ty specifičtější budou mít přednost – takže je nemusí ručně řadit uživatel. U regulárních výrazů nic takového udělat nejde – dokážete sestrojit milion regulárních výrazů, které vyhoví stejné cestě. Takže tam nezbývá nic jiného, než to nechat na uživateli, který vzor má mít přednost. Je logické pro to použít pořadí v konfiguraci (dělají to tak všichni), akorát se řekne, jestli vyhrává první nebo poslední.

Navíc je to popsané hned v druhém odstavci dokumentace: https://nginx.org/en/docs/http/ngx_http_core_module.html#location To je první místo, kam jste se měl podívat.