Qual è la differenza tra le variabili Nginx $host e $http_host?

Pubblicato 27 agosto 2024

Problema: Comprendere le Variabili $host e $http_host di Nginx

Nell'utilizzo di Nginx, potresti incontrare due variabili che sembrano simili: $host e $http_host. Queste variabili hanno usi diversi e possono comportarsi differentemente a seconda della situazione. Comprendere le loro differenze è importante per configurare correttamente i server e gestire le richieste in Nginx.

Cosa Sono $host e $http_host in Nginx?

La Variabile $host in Nginx

La variabile $host in Nginx rappresenta il nome del server per la richiesta in elaborazione. Nginx imposta il valore di $host seguendo questo ordine:

  1. Il nome host dalla riga di richiesta
  2. Il nome host dal campo "Host" dell'header della richiesta
  3. Il nome del server che corrisponde alla richiesta

Se nessuna di queste fonti fornisce un nome host valido, Nginx usa una stringa vuota come valore per $host.

La Variabile $http_host in Nginx

La variabile $http_host corrisponde al campo dell'header "Host" nella richiesta HTTP. Questo header è inviato dal client (solitamente un browser web) e contiene il nome di dominio del server.

A differenza di $host, $http_host non subisce l'elaborazione di Nginx. Riflette il valore esatto dell'header "Host" come ricevuto nella richiesta HTTP. Se l'header "Host" è assente dalla richiesta, $http_host sarà una stringa vuota.

Differenze Chiave tra $host e $http_host

Ordine di Precedenza

Nginx imposta il valore di $host in un ordine specifico. Controlla prima il nome host nella riga di richiesta. Se non disponibile, guarda il campo dell'header "Host". Se entrambi sono assenti, usa il nome del server che corrisponde alla richiesta. Questo ordine aiuta Nginx a gestire diversi tipi di richieste.

$http_host viene utilizzato quando l'header "Host" è presente nella richiesta HTTP. Se l'header manca, $http_host rimane vuoto. A differenza di $host, $http_host non ha un'opzione di backup e riflette direttamente la richiesta del client.

Comportamento con Nomi Server e Hostname

La variabile $host funziona con la direttiva server_name in Nginx. Quando arriva una richiesta, Nginx la confronta con i valori server_name nella sua configurazione. Se trova una corrispondenza, quel valore diventa parte della variabile $host. Ciò permette configurazioni diverse dei blocchi server basate sui nomi di dominio.

$http_host è legato ai campi dell'header della richiesta. Riflette l'header "Host" inviato dal client. Questo rende $http_host utile per registrare l'hostname esatto utilizzato dal client per accedere al server, che potrebbe essere diverso dal nome server utilizzato internamente da Nginx.

Utilizzo di $host e $http_host nella Configurazione di Nginx

$host nei Blocchi Server di Nginx

La variabile $host è utile nei blocchi server di Nginx con direttive server_name. Ecco un esempio:

server {
    listen 80;
    server_name esempio.com www.esempio.com;

    location / {
        root /var/www/$host;
    }
}

Questa configurazione usa $host per percorsi flessibili della root dei documenti. Per richieste a "esempio.com", Nginx serve i file da "/var/www/esempio.com". Per "www.esempio.com", usa "/var/www/www.esempio.com".

Questo approccio:

  • Gestisce più domini in un solo blocco server
  • Semplifica la configurazione per siti con strutture simili
  • Facilita l'aggiunta di nuovi domini

$http_host per Logging e Reindirizzamenti

$http_host è utile per il logging e i reindirizzamenti. Ecco come usarlo nei log di accesso:

log_format personalizzato '$remote_addr - $remote_user [$time_local] '
                          '"$request" $status $body_bytes_sent '
                          '"$http_referer" "$http_user_agent" "$http_host"';

access_log /var/log/nginx/access.log personalizzato;

Questa configurazione aggiunge $http_host ai tuoi log di accesso, mostrando l'hostname che i client usano per accedere al tuo server.

Per i reindirizzamenti, $http_host aiuta a mantenere l'hostname originale:

server {
    listen 80;
    server_name esempio.com www.esempio.com;

    if ($http_host = "www.esempio.com") {
        return 301 $scheme://esempio.com$request_uri;
    }
}

Questa configurazione reindirizza "www.esempio.com" a "esempio.com", mantenendo il protocollo originale ($scheme) e il percorso ($request_uri). Usare $http_host mantiene l'hostname esatto dalla richiesta del client, importante per reindirizzamenti accurati.