ubicaciones anidadas nginx


60

Tengo problemas para comprender las ubicaciones anidadas en nginx. Tengo dos ubicaciones con algunas directivas de configuración en común, por lo que en lugar de repetir las directivas, preferiría repetir el URI usando una expresión regular:

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

Sin embargo, esto da el error

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

Sin |embargo, sin el o parece estar bien.

location ~ /a {
        location /a {
        }
}

¿Qué estoy haciendo mal? ¿Hay una mejor manera de hacer esto sin repetir nada? ¿Puedo agrupar ubicaciones de otra manera?


1
¿Por qué agruparlos? ¿Por qué no solo KISS?
pkhamre 05 de


66
porque lógicamente están agrupados
Jayen

Esto me llevó mucho tiempo entender, pero al final pude crear una lista de prioridades simple (ish) de cómo se eligen las ubicaciones .
artfulrobot

Respuestas:


101

Antigua pregunta, pero el problema es porque la ubicación principal es una ubicación de expresiones regulares, mientras que las ubicaciones anidadas son ubicaciones de prefijo.

Solo puede definir ubicaciones de prefijo anidadas cuando la ubicación principal también es una ubicación de prefijo:

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

Cuando una ubicación principal se define mediante una expresión regular, cualquier ubicación anidada también debe definirse mediante expresiones regulares:

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

Sin embargo, también puede definir ubicaciones de expresiones regulares anidadas cuando la ubicación principal es una ubicación de prefijo:

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

Tu primera oración me confundió, pero tus ejemplos tienen sentido. Supongo que en el último ejemplo, ¿la ubicación del prefijo /barrojará un error?
Jayen

13
Esa primera oración debe estar en la documentación .
AndreKR

1
En el primer ejemplo, si location /a { }omite la repetitiva, ¿importa el orden?
Meekohi

2
Ah, no importa que haya entendido mal. Las ubicaciones anidadas no heredan nada de sus ubicaciones principales.
Meekohi

La ubicación principal puede ser una ubicación no regex, pero todas las ubicaciones anidadas múltiples dentro del padre deben ser regex / no regex.
MitchellK
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.