This is an old revision of the document!
Table of Contents
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