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?

Jayen
fuente
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 {
        ...
        }
}
Dayo
fuente
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