La directiva location de Nginx es una herramienta potente para controlar cómo se procesan distintos tipos de solicitudes. Al definir reglas en bloques location, puedes aplicar configuraciones específicas, redirigir el tráfico a diferentes partes de tu aplicación o incluso bloquear completamente ciertas solicitudes. El uso correcto de esta directiva permite una gestión eficiente de las peticiones, lo cual es clave para mejorar el rendimiento, la seguridad y la funcionalidad de las aplicaciones web.
La directiva location se define en el archivo de configuración nginx.conf:
location [modifier] uri { ... }
modifier: parámetro opcional que define el tipo de coincidencia (exacta, prefijo, expresión regular, etc.)
uri: la URI que se debe comparar
Dentro de las llaves puedes definir distintas directivas como proxy_pass, root o index.
Una coincidencia exacta ocurre cuando la cadena proporcionada coincide exactamente con la URI solicitada.
location = /exact-match {
root /var/www/html;
index index.html;
}
Solo las solicitudes a /exact-match serán procesadas por este bloque.
También puedes añadir condiciones usando if (ten en cuenta que Nginx no tiene un if-else tradicional):
location = /exact-match {
root /var/www/html;
index index.html;
if ($http_user_agent ~* "Chrome") {
add_header X-Browser "Chrome";
}
}
Si el agente de usuario es Chrome, la respuesta incluirá el encabezado adicional X-Browser.
Es el tipo más común y coincide con cualquier URI que comience con la cadena especificada.
location /prefix {
root /var/www/html;
index index.html;
if ($request_method = POST) {
return 405;
}
}
Este bloque gestiona solicitudes como /prefix/page1 o /prefix/page2. Si el método es POST, Nginx devuelve 405 Method Not Allowed.
Para escenarios más complejos, puedes usar expresiones regulares.
Comodines comunes:
. – coincide con un carácter
.* – coincide con cualquier secuencia
^ – inicio de cadena
$ – final de cadena
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
if ($request_uri ~* "/admin") {
return 403;
}
if ($request_uri !~* "/admin") {
add_header X-Admin "Not Admin";
}
}
Explicación:
~* indica coincidencia sin distinguir mayúsculas
\.php$ coincide con archivos PHP
si la URI contiene /admin → 403 Forbidden
si no, se añade X-Admin: Not Admin
location ~* \.jpg$ {
root /var/www/images;
if ($http_referer !~* "^https?://(www\.)?example\.com") {
return 403;
}
}
Coincide con .jpg, .JPG, etc., y solo sirve imágenes si el referer proviene de example.com.
Nginx evalúa los bloques así:
Exacto (=) – máxima prioridad
Expresiones regulares (~, ~*) – en orden de aparición
Prefijos (/) – el prefijo más largo gana
Ejemplo:
location = /exact { }
location ~* \.jpg$ { }
location / { }
location /nested {
location /nested/subnested {
root /var/www/html;
}
root /var/www/html;
}
Las solicitudes a /nested/subnested usan el bloque interno.
server {
listen 80;
server_name localhost;
location / {
root /var/www/html;
index index.html;
}
location = /about {
root /var/www/html;
index about.html;
}
location /api {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~ \.php$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
location ~* \.(jpg|jpeg|png|gif|ico)$ {
root /var/www/images;
}
location /admin {
root /var/www/admin;
index index.html;
location /admin/stats {
proxy_pass http://localhost:8080/stats;
}
}
}
sudo systemctl reload nginx
Validar configuración:
sudo nginx -t
Probar rutas:
curl -I http://localhost/about
curl -X POST http://localhost/prefix/form
curl -H "User-Agent: Chrome" http://localhost/exact-match
Ver logs:
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
location /admin {
allow 192.168.1.100;
deny all;
}
Solo esa IP puede acceder.
|
Directiva |
Comportamiento |
|
root |
añade la URI |
|
alias |
reemplaza el prefijo |
Ejemplo con alias:
location /files/ {
alias /data/downloads/;
}
Nota: siempre termina alias con /.
Comprender la directiva location es esencial para un manejo preciso de las solicitudes. Las coincidencias exactas, por prefijo y por regex tienen diferentes prioridades y afectan directamente al rendimiento y comportamiento del sitio. Al dominar estos patrones y usar bloques anidados, puedes construir configuraciones Nginx limpias, eficientes y seguras.