La direttiva location di Nginx è uno strumento potente per controllare il modo in cui vengono gestite le diverse richieste. Definendo regole nei blocchi location, puoi applicare configurazioni specifiche, indirizzare il traffico verso parti diverse dell’applicazione oppure bloccare completamente alcune richieste. Un uso corretto di questa direttiva consente una gestione efficiente delle richieste, fondamentale per migliorare prestazioni, sicurezza e funzionalità delle applicazioni web.
La direttiva location è definita nel file di configurazione nginx.conf:
location [modifier] uri { ... }
modifier: parametro opzionale che definisce il tipo di corrispondenza (esatta, prefisso, regex)
uri: l’URI da confrontare
All’interno delle parentesi graffe puoi inserire varie istruzioni come proxy_pass, root o index.
Una corrispondenza esatta avviene quando la stringa specificata coincide perfettamente con l’URI richiesto.
location = /exact-match {
root /var/www/html;
index index.html;
}
Solo le richieste verso /exact-match verranno elaborate da questo blocco.
Puoi anche usare una condizione if (nota che Nginx non supporta un vero if-else):
location = /exact-match {
root /var/www/html;
index index.html;
if ($http_user_agent ~* "Chrome") {
add_header X-Browser "Chrome";
}
}
Se lo user agent è Chrome, la risposta includerà l’header X-Browser.
È il tipo più comune: corrisponde a qualsiasi URI che inizi con la stringa indicata.
location /prefix {
root /var/www/html;
index index.html;
if ($request_method = POST) {
return 405;
}
}
Questo blocco gestisce tutte le richieste che iniziano con /prefix. Se il metodo è POST, Nginx restituisce 405 Method Not Allowed.
Per scenari più complessi puoi usare le regex.
Caratteri jolly comuni:
. qualsiasi carattere
.* qualsiasi sequenza
^ inizio stringa
$ fine stringa
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";
}
}
Spiegazione:
~* indica regex case-insensitive
\.php$ intercetta i file PHP
se l’URI contiene /admin, ritorna 403
altrimenti aggiunge l’header X-Admin
location ~* \.jpg$ {
root /var/www/images;
if ($http_referer !~* "^https?://(www\.)?example\.com") {
return 403;
}
}
Corrisponde a .jpg, .JPG, ecc., e serve le immagini solo se il referer proviene da example.com.
Nginx segue queste regole:
Match esatto (=)
Regex (~, ~*) nell’ordine di definizione
Prefissi (/), dove vince il più lungo
Esempio:
location = /exact { }
location ~* \.jpg$ { }
location / { }
location /nested {
location /nested/subnested {
root /var/www/html;
}
root /var/www/html;
}
Le richieste verso /nested/subnested usano il blocco 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
Controlla la configurazione:
sudo nginx -t
Test delle route:
curl -I http://localhost/about
curl -X POST http://localhost/prefix/form
curl -H "User-Agent: Chrome" http://localhost/exact-match
Log:
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
location /admin {
allow 192.168.1.100;
deny all;
}
Solo quell’IP potrà accedere.
|
Direttiva |
Comportamento |
|
root |
aggiunge l’URI |
|
alias |
sostituisce il prefisso |
Esempio:
location /files/ {
alias /data/downloads/;
}
Nota: con alias, termina sempre il percorso con /.
Comprendere a fondo la direttiva location è fondamentale per gestire correttamente le richieste in Nginx. I diversi tipi di match (esatto, prefisso, regex) e le loro priorità influiscono direttamente su prestazioni e comportamento del sito. Usando anche i blocchi annidati, puoi creare configurazioni pulite, efficienti e altamente controllate.