User Tools

Site Tools


guia_rapida_de_location_y_modificadores_en_nginx

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
guia_rapida_de_location_y_modificadores_en_nginx [2021/05/10 21:30] busindreguia_rapida_de_location_y_modificadores_en_nginx [2021/05/11 00:08] (current) busindre
Line 3: Line 3:
 ==== Modificadores ==== ==== Modificadores ====
  
 +**Prioridad**
 +
 +El uso de modificadores y su prioridad en Nginx es algo confuso y esta pequeña guía intenta poder aclarar todos los casos posibles.
 +
 +Las coincidencias exactas "=" tienen siempre prioridad, es decir, da igual donde se definan, que de existir y coincidir con alguna query, la localización será la usada. Después se tienen las localizaciones por prefijo "^~", el cual tiene menos prioridad que la coincidencia exacta pero más que las regex, por lo tanto, da lo mismo donde se definan en el fichero de configuración. De haber varias se usará la que mejor encaje con el prefijo. 
 +
 +Luego están las localizaciones que usan expresiones regulares "~" y "~*". La primera localización que coincida será elegida, aunque más adelante se encuentre otra más completa y que encaje mejor. 
 +
 +Si no se usa modificador, se está usando una localización por prefijo similar a ^~, pero no tiene su misma prioridad frente a las regex. Es decir, de haber una regex por delante que coincida, la localización sin prefijo no será evaluada. Estos prefijos sin modificador, de no tener regex por encima pero sí una o varias localizaciones con ^~, pueden ser elegidas si el prefijo coincide de forma más completa que en localizaciones con ^~. Es decir, el no usar modificador hace uso de prefijo y no compite en prioridad con ^~, simplemente se usa siempre el prefijo que coincida en mayor medida.
 +
 +  - Coincidencia exacta =.
 +  - Coincidencia prefijo con prioridad ^~.
 +  - Expresión regular (sensible a mayúsculas y no sensible a mayúsculas).
 +  - Coincidencia prefijo “Ningún modificador”.
  
 **=** 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. El orden de estas location NO importa. **=** 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. El orden de estas location NO importa.
Line 9: Line 23:
 <code>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á. }</code> <code>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á. }</code>
  
-<code>+<code bash>
 # Query GET /cp/abc # Query GET /cp/abc
 location ~ ^cp/abc{} location ~ ^cp/abc{}
 location ^~ /cp {} location ^~ /cp {}
 location ^~ /cp/abc {} location ^~ /cp/abc {}
-location = /cp/abc {}  <---</code>+location = /cp/abc {}  <--- location seleccionada.</code>
  
 **^~** No permite expresiones regulares. Actúa como un prefijo, de haber varias location, la que encaje con el prefijo más largo es la location elegida. Por lo tanto NO es importante el orden de este tipo de expresiones regulares. **^~** No permite expresiones regulares. Actúa como un prefijo, de haber varias location, la que encaje con el prefijo más largo es la location elegida. Por lo tanto NO es importante el orden de este tipo de expresiones regulares.
Line 20: Line 34:
 <code bash> <code bash>
 # Query GET /cp/abc # Query GET /cp/abc
-location ^~ /cp/{} 
 location ^~ /cp/ab {} location ^~ /cp/ab {}
-location ~ ^cp/abc{}   # NO será seleccionada porque es una regex y NO tiene prioridad frente al uso de prefijos (^~ o ningún modificador)+location ~ ^/cp/abc {} # NO será seleccionada porque es una regex y NO tiene prioridad frente al uso de ^~. 
-location ^~ /cp/abc {} <---</code>+location ^~ /cp/abc {} <--- location seleccionada.</code>
  
-NOTA: Es el método recomendado cuando no se usan expresiones regulares.+NOTA: Es el método recomendado frente a usar "ningún modificador" cuando no se requieren expresiones regulares.
  
-**(ninguno)**: Actúa como un prefijo exactamente igual que "^~" y tiene su misma prioridad frente a regex. NO es importante el orden y la que coincida con el prefijo más largo será la elegidaNO tiene tampoco prioridad especial frente a "^~", si hay dos location iguales, una sin modificador y otra con ^~, la primera será la utilizada.+**(ninguno)**: Actúa como un prefijo exactamente igual que "^~" y tiene la misma prioridad frente a "^~" pero NO frente a regex. Por lo tanto, SÍ es importante el orden frente a otras location que usen modificador regex. 
 + 
 +No puede haber dos location iguales basadas en prefijo, una sin modificador y otra con ^~.
  
 <code bash> <code bash>
 # Query GET /cp/abc # Query GET /cp/abc
-location /cp/{} +location ~/cp/ab {}   <---- 
-location /cp/ab {} +location /cp/abc{}    No será usada porque no tiene prioridad frente a las regex que estén en una posición anterior.
-location ~ ^cp/abc{} # NO será seleccionada porque es una regex y NO tiene prioridad frente al uso de prefijos (^~ o ningún modificador). +
-location /cp/abc {}  <--- Location seleccionada +
-location ^~/cp/abc {}+
 </code> </code>
  
-A partir de estos tres modificadores (=, ~^ y ninguno), los siguientes modificadores refieren a expresiones regulares, siendo el primero en encajar el seleccionado. Por lo tanto SI importa el orden usado al usar regex. 
  
-**~** (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.+NOTA: Es preferible usar el método de prefijo ^~ ya que internamente tiene un mejor rendimiento. 
 + 
 +**~** (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. SÍ importa el orden ya que el primero en coincidir será el usado.
  
 <code>location ~^/cp { # Distingue entre mayúsculas y minúsculas }</code> <code>location ~^/cp { # Distingue entre mayúsculas y minúsculas }</code>
  
  
-**~*** (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.                                                         +**~*** (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. Al igual que el anterior modificador case sensitive, SÍ importa el orden ya que el primero en coincidir será el usado.
  
-<code>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/"  }</code>+<code>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 modificador de prefijo "location ^~ /img/" o "location /img/" }</code>
 <code>location ~*^/cp { # cualquier cosa que empiece con /cp, /CP, /cP o /Cp }</code> <code>location ~*^/cp { # cualquier cosa que empiece con /cp, /CP, /cP o /Cp }</code>
 <code>location ~*/cp { # cualquier cosa que tenga /cp, /CP, /cP o /Cp en alguna parte de la URL, no necesariamente al principio. }</code> <code>location ~*/cp { # cualquier cosa que tenga /cp, /CP, /cP o /Cp en alguna parte de la URL, no necesariamente al principio. }</code>
 +==== Modificadores en nested location ====
  
 +Recordemos la prioridad de los modificadores en Nginx.
  
-NOTASi se usan nested locations, la lógica a seguir es la misma, la location que concuerde en mayor medida será la usada.+  - Coincidencia exacta =. 
 +  - Coincidencia prefijo con prioridad ^~. 
 +  - Expresión regular (sensible a mayúsculas y no sensible a mayúsculas)La primera en coincidir es la location usada
 +  - Coincidencia prefijo "Ningún modificador".
  
-<code bash>location ~ ^/((be|ch|de|dk)/)?upload/+Cuando se anidan locations en nginx, se debe tener en cuenta que si el location raíz es una regex, sus location anidadas deben también usar modificadores de expresiones regulares. Si se anidan coincidencias exactas o de prefijo a una nested location con regex, estas nunca serán elegidas.
-   proxy_pass  https://AAA;+
  
-   location ~ ^/((be|ch|de|dk)/)?upload/quick/ {  +<code bash> 
-      proxy_pass  https://BBB; +# Query GET /cp/abc 
-   }+location ~ /cp { 
 +   ... 
 +   location = /cp/abc {}  # Nunca será seleccionada 
 +   location /cp/abc {}    # Nunca será seleccionada 
 +   location ^~/cp/abc {}  # Nunca será seleccionada 
 +   location ~/cp/abc {  <----- Sí (Debido a que es una regex).
 }</code> }</code>
  
-<code>http://domain.com/de/upload/quick---> https://BBB +En cambio con los modificadores de coincidencia exacta o mediante prefijo se puede combinar como se quiera. Dentro del nested location se usa la prioridad normal anteriormente vista. 
-http://domain.com/de/upload---> https://AAA</code>+ 
 +<code bash> 
 +location /cp { 
 +   ... 
 +   location = /cp/abc {} # Query GET /cp/abc 
 +   location ~/cp/abcd {} # Query GET /cp/abcd 
 +   location /cp/abcd {}  # Nunca será seleccionada porque la anterior (regex) es usada. De ser "location ^~ /cp/abcd {}" SÍ tendría prioridad frente a la regex. 
 +}</code>
  
 ==== Location sin expresiones regulares y proxy_pass ==== ==== Location sin expresiones regulares y proxy_pass ====
guia_rapida_de_location_y_modificadores_en_nginx.1620675015.txt.gz · Last modified: 2021/05/10 21:30 by busindre