Vraag geneste locaties nginx


Ik heb problemen met het begrijpen van geneste locaties in nginx. Ik heb twee locaties met een aantal configuratierichtlijnen, dus in plaats van de richtlijnen te herhalen, geef ik er de voorkeur aan de URI te herhalen met een reguliere expressie:

location ~ /a|/b {
        location /a {
        }
        location /b {
        }
}

Dit geeft echter de fout

nginx: [emerg] location "/a" is outside location "/a|/b" in /etc/nginx/nginx.conf:36

Zonder de of | het lijkt echter goed.

location ~ /a {
        location /a {
        }
}

Wat doe ik verkeerd? Is er een betere manier om dit te doen zonder iets te herhalen? Kan ik locaties op een andere manier groeperen?


47
2018-04-05 07:09


oorsprong


Waarom groeperen? Waarom niet gewoon KISS? - pkhamre
forum.nginx.org/read.php?2,174517,174534#msg-174534 - pkhamre
omdat ze logisch zijn gegroepeerd - Jayen
Dit duurde lang voordat ik het begreep, maar uiteindelijk was ik in staat om een ​​eenvoudige (ish) te maken prioriteitenlijst van hoe locaties worden gekozen. - artfulrobot


antwoorden:


Oude vraag, maar het probleem is dat de bovenliggende locatie een regex-locatie is, terwijl de geneste locaties prefixlocaties zijn.

U mag alleen geneste prefixlocaties definiëren wanneer de bovenliggende locatie ook een prefixlocatie is:

location /a {
        location /a {
               # You can also skip this location and just write
               # your code directly under the parent location
        }
        location /a/b {
        ...
        }
}

Wanneer een bovenliggende locatie wordt gedefinieerd door een regex, moeten alle geneste locaties ook worden gedefinieerd door regexes:

location ~ ^/(a|b) {
        location ~ ^/a {
        ...
        }
        location ~ ^/b {
        ...
        }
}

U kunt echter ook geneste regex-locaties definiëren wanneer de bovenliggende locatie een prefixlocatie is:

location /a/b {
        location ~ /a {
        ...
        }
        location ~ /b {
        ...
        }
}

80
2017-09-09 15:00



Ik raakte in de war door je eerste zin, maar je voorbeelden zijn logisch. Ik neem aan dat in het laatste voorbeeld de prefixlocatie is /b zal een foutmelding geven? - Jayen
Die eerste zin hoort in de documentatie. - AndreKR
In het eerste voorbeeld, als u de location /a { } boilerplate - doet de volgorde ertoe? - Meekohi
Ooit heb ik het verkeerd begrepen. De geneste locaties nemen niets over van hun bovenliggende locaties. - Meekohi
De bovenliggende locatie kan een niet-regex-locatie zijn, maar alle meerdere geneste locaties binnen het bovenliggende element moeten allemaal regex / non-regex zijn. - MitchellK