Rewrites e redirects
Ci sono vari modi per ottenere un rewrite/redirect con NGINX.
Direttiva return
return [status] [uri]
Se lo status di return è 3xx, la direttiva si aspetta non più una stringa, ma un URI a cui fare il reindirizzamento.
return 307 /some/path
Un redirect comunica semplicemente al client dove reindirizzarsi. Il server NGINX non compie alcuna azione.
Direttiva rewrite
rewrite [pattern] [uri]
Una rewrite muta l'URI internamente:
# La direttiva rewrite accetta delle RegEx
rewrite ^/user/\w+ /greet;
location /greet {
# Sia /greet che /user/john
# risponderanno qui
# ma l'URI per il client rimane
# quello che ha richiesto
}
Quando il server NGINX incontra un rewrite, rievaluta da capo la richiesta con il nuovo URI. Per questo motivo è più dispendioso di risorse di un return.
Rewrites con parametri
Si possono parametrizzare i rewrite usando delle variabili all'interno dell'URI richiesto
# (\w+) viene salvato come $1 e passato a /greet
rewrite ^/user/(\w+)/ /greet/$1;
location = /greet/john {
# Risponderanno solo
# /greet/john e
# /user/john
}
location /greet {
# Risponderanno qualsiasi
# /user e /greet
}
Last rewrite
Si può specificare un rewrite come l'ultimo rewrite che si può eseguire per un URI.
rewrite ^/user/(\w+)/ /greet/$1 last;
rewrite ^/greet/john /thumb.png;
location /greet/john {
# Risponderà solo
# /user/john
}
# /greet/john verrà rediretto a /thumb.png
Direttiva try_files
Questa direttiva può essere applicata sia al contesto server che al contesto location.
server {
try_files [path1] [path2] [final];
location / {
try_files [path1] [path2] [final];
}
}
Permette a NGINX di rispondere a una risorsa con un qualsiasi numero di locations definite. Quando non riesce a valutare tutte le risorse precedenti, l'ultima viene trasformata in una rewrite.
NGINX proverà a rispondere, se esiste, prima con la risorsa [path1], poi con la risorsa [path2]. Se nessuna di queste dovesse essere disponibile, NGINX trasformerà la richiesta con un rewrite a una location determinata dall'ultimo parametro [final].
L'uso più comune di try_files è quello con le Variabili:
# Prova prima di tutto l'URI passato
try_files $uri /cat.png /greet;
Permette di creare pagine di default, come una 404.
Named locations
Associa un nome a una location, per poi usarlo all'interno di un try_files.
# Definisco un nome con il carattere @
try_files $uri @friendly_404;
location @friendly_404 {
return 404 "Not found";
}