guia_rapida_de_location_y_modificadores_en_nginx

This is an old revision of the document!


Guía rápida de Nginx locations (Modificadores, prioridad y slash - proxy_pass)

Modificadores

= El bloque se considerará una coincidencia si la URI de la solicitud coincide exactamente con la ubicación indicada. Es lo primero que busca Nginx, no pueden repetirse y tienen prioridad sobre cualquier otra location, usen o no expresiones regulares.

location  = / {  # Solo se usa si coincide al 100%, en este caso "/" únicamente. }
location  = /img/ {  # Solo se usa si coincide al 100%, en este caso "/img/" únicamente. Si la query es /img/algo_más NO se usará. }

^~ No permite expresiones regulares. Actúa como un prefijo, si este location coincide, NO seguirá buscando más, por lo tanto es importante el ORDEN de este tipo de expresiones regulares.

location ^~ /img/ {  # Queries que comiencen con /img/ y deja de buscar, por ejemplo /img/dir1/blabla } 

A partir de estos dos modificadores (= y ~^), la siguientes locations serán seleccionadas según tengan la mayor coincidencia (sin importar el orden).

NOTA: Es el método recomendado cuando no se usan expresiones regulares.

(ninguno): La ubicación se interpreta como una coincidencia de prefijo. Esto significa que la ubicación dada se comparará con el principio del URI de la solicitud para determinar una coincidencia.

location /data {   # Cualquier query que comience por /data/ pero seguirá buscando si otra regex coincide de manera más exacta.}

~ (Modificador de expresión regular) La ubicación se interpretará como una coincidencia de expresión regular que distingue entre mayúsculas y minúsculas.

location ~^/cp { # Distingue entre mayúsculas y minúsculas }

~* (Modificador de expresión regular) La ubicación se interpretará como una coincidencia de expresión regular que no distingue entre mayúsculas y minúsculas.

location ~* .(png|gif|ico|jpg|jpeg)$ { # Queries que terminen con png, gif, ico, jpg o jpeg. Al no ser que la query tenga un /img/ y exista un "location ^~ /img/"  }
location ~*^/cp { # cualquier cosa que empiece con /cp, /CP, /cP o /Cp }
location ~*/cp { # cualquier cosa que tenga /cp, /CP, /cP o /Cp en alguna parte de la URL, no necesariamente al principio. }

NOTA: Si se usan nested locations, la lógica a seguir es la misma, la location que concuerde en mayor medida será la usada.

location ~ ^/((be|ch|de|dk)/)?upload/ {
   proxy_pass  https://AAA;
 
   location ~ ^/((be|ch|de|dk)/)?upload/quick/ { 
      proxy_pass  https://BBB;
   }
}
http://domain.com/de/upload/quick/ ---> https://BBB
http://domain.com/de/upload/ ---> https://AAA

Location sin expresiones regulares y proxy_pass

Ejemplos de comportamiento para location de Nginx que no usan regex, es decir modificador “ninguno” o “^~”. El modificador “=” en esta sección no tiene sentido ya que no permite usarse de manera flexible.

location ^~/cp { proxy_pass  http://192.168.178.25; }
 
http://XXX/cp/aaa ----> http://192.168.178.25/cp/aaaa
http://XXX/cp -------->  http://192.168.178.25/cp
http://XXX/cp/ ------->  http://192.168.178.25/cp/
location ^~/cp { proxy_pass  http://192.168.178.25/;  }
 
http://XXX/cp/aaa ---> http://192.168.178.25//aaa
http://XXX/cp/ ------> http://192.168.178.25//
http://XXX/cp -------> http://192.168.178.25/
location ^~/cp/ { proxy_pass  http://192.168.178.25/;  }
 
http://XXX/cp/aaa ---> http://192.168.178.25/aaa
http://XXX/cp/ ------> http://192.168.178.25/
http://XXX/cp -------> http://XXX/cp/ ----> http://192.168.178.25/
location ^~/cp/ { proxy_pass  http://192.168.178.25; }
 
http://XXX/cp/aaa ---> http://192.168.178.25/cp/aaa
http://XXX/cp/ ------> http://192.168.178.25/cp
http://XXX/cp ------->  http://XXX/cp/ --> http://192.168.178.25/cp

Location con expresiones regulares y proxy_pass sin URL

location ~ /c(p|a)/ {  proxy_pass  http://192.168.178.25; }
 
http://XXX/cp/aaa ---> http://192.168.178.25/cp/aaa
http://XXX/cp/ ------> http://192.168.178.25/cp/
http://XXX/cp -------> NOT FOUND
#  Al no especificarse una URL (incluir al menos un slash) en proxypass, la variable $1 no tendrá ningún valor.
location ~ ^/c(p|a)/ {  proxy_pass  http://192.168.178.25; }
location ~ ^/cp/ {  proxy_pass  http://192.168.178.25$1; }
location ~ ^/cp/ {  proxy_pass  http://192.168.178.25; }
 
http://XXX/cp/aaa ---> http://192.168.178.25/cp/aaa
http://XXX/cp/ ------> http://192.168.178.25/cp/
http://XXX/cp -------> http://192.168.178.25/cp

Location con expresiones regulares y proxy_pass con URL

Si se usan URLs en el proxypass, deben usarse variables, $1, $2, $3,… Las cuales tendrán el valor resultante de cada regex para ser integradas en la URL del proxy_pass. Las variables pueden tener nombres personalizados. Si no se usan variables cuando se utilizan URLs (uso de slash) en proxy_pass, Nginx mostrará el siguiente error.

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in

La obligación de usar variables, implica que para agrupar sus valores deben usarse paréntesis, veamos algunos ejemplos de uso de location con expresiones regulares y URLs en proxy_pass.

# No hay regex activa, por lo que $1 no contiene ningún valor.
location ~ ^/cp/ {  proxy_pass  http://192.168.178.25/$1; }
 
http://XXX/cp/bbbb ----> http://192.168.178.25/
http://XXX/ca/bbb ----> http://192.168.178.25/
 
location ~ ^/cp/ {  proxy_pass  http://192.168.178.25/$1/hola; }
 
http://XXX/cp/bbbb ----> http://192.168.178.25/hola
http://XXX/ca/bbb ----> http://192.168.178.25/hola
 
# La Expresión regular refiere a "p" o "a".
location ~ ^/c(p|a) {  proxy_pass  http://192.168.178.25/$1/$1; }
location ~ ^/c(p|a)/ {  proxy_pass  http://192.168.178.25/$1/$1; }
 
http://XXX/cp/bbbb ----> http://192.168.178.25/p/p 
http://XXX/ca/bbb ----> http://192.168.178.25/a/a
 
# La Expresión regular refiere a "/cp/" o "/ca/".
location ~ ^(/cp/|/ca/) {  proxy_pass  http://192.168.178.25/dir1/dir2$1; }
 
http://XXX/cp/AAA/BBB/CCC ---> http://192.168.178.25/dir1/dir2/cp/
http://XXX/ca/AAA/BBB/CCC ---> http://192.168.178.25/dir1/dir2/ca/
 
# La expresión regular refiere a cualquier location.
location ~ ^/(.*) {  proxy_pass  http://192.168.178.25/dir1/$1/dir2; }
 
http://XXX/cp/AA/BBB ---> http://192.168.178.25/dir1/cp/AA/BBB/dir2
http://XXX  ------------> http://192.168.178.25/dir1//dir2
http://XXX/ ------------> http://192.168.178.25/dir1//dir2

Varias regex y personalización de nombre de variables

# El valor obtenido con la primera regex se guarda en la variable "$width" y el segundo en "$height" para luego ser enviadas al host en la forma expuesta.
location ~/resize/(?<width>(\d+))/(?<height>(\d+)) { proxy_pass  http://192.168.178.25/?ancho=$width&alto=$height&blabla=null;}
 
http://XXX/resize/300/500/ ----> http://192.168.178.25/?ancho=300&alto=500&blabla=null
guia_rapida_de_location_y_modificadores_en_nginx.1620517649.txt.gz · Last modified: 2021/05/09 01:47 by busindre