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";
}