Wat is het verschil tussen $host en $http_host Nginx variabelen?

Gepubliceerd 5 juli 2024

Probleem: Nginx Variabelen $host vs $http_host Begrijpen

Bij het gebruik van Nginx zie je mogelijk twee variabelen die op elkaar lijken: $host en $http_host. Deze variabelen hebben verschillende toepassingen en kunnen zich anders gedragen op basis van de situatie. Het is belangrijk om te weten hoe ze verschillen voor het correct instellen van servers en het afhandelen van verzoeken in Nginx.

Wat Zijn $host en $http_host in Nginx?

$host Variabele in Nginx

De $host variabele in Nginx vertegenwoordigt de servernaam voor het verzoek dat wordt verwerkt. Nginx stelt de waarde van $host in met behulp van deze volgorde:

  1. De hostnaam uit de verzoekregel
  2. De hostnaam uit het "Host" verzoek header veld
  3. De servernaam die overeenkomt met het verzoek

Als geen van deze bronnen een geldige hostnaam levert, gebruikt Nginx een lege string als waarde voor $host.

$http_host Variabele in Nginx

De $http_host variabele komt overeen met het "Host" header veld in het HTTP-verzoek. Deze header wordt verstuurd door de client (meestal een webbrowser) en bevat de domeinnaam van de server.

In tegenstelling tot $host, ondergaat $http_host geen verwerking door Nginx. Het weerspiegelt de exacte waarde van de "Host" header zoals ontvangen in het HTTP-verzoek. Als de "Host" header afwezig is in het verzoek, zal $http_host een lege string zijn.

Belangrijkste Verschillen Tussen $host en $http_host

Volgorde van Voorrang

Nginx stelt de waarde van $host in volgens een specifieke volgorde. Het controleert eerst de hostnaam in de verzoekregel. Als deze niet beschikbaar is, kijkt het naar het "Host" header veld. Als beide afwezig zijn, gebruikt het de servernaam die overeenkomt met het verzoek. Deze volgorde helpt Nginx om verschillende soorten verzoeken af te handelen.

$http_host wordt gebruikt wanneer de "Host" header in het HTTP-verzoek aanwezig is. Als de header ontbreekt, blijft $http_host leeg. In tegenstelling tot $host heeft $http_host geen back-upoptie en weerspiegelt het direct het verzoek van de client.

Gedrag met Servernamen en Hostnamen

De $host variabele werkt samen met de server_name directive in Nginx. Wanneer een verzoek binnenkomt, vergelijkt Nginx dit met de server_name waarden in zijn configuratie. Als het een overeenkomst vindt, wordt die waarde onderdeel van de $host variabele. Dit maakt verschillende serverblok configuraties mogelijk op basis van domeinnamen.

$http_host is gekoppeld aan de verzoek header velden. Het weerspiegelt de "Host" header die door de client is verzonden. Dit maakt $http_host nuttig voor het loggen van de exacte hostnaam die de client gebruikte om toegang te krijgen tot de server, wat mogelijk verschilt van de servernaam die Nginx intern gebruikt.

Het Gebruik van $host en $http_host in Nginx Configuratie

$host in Nginx Serverblokken

De $host variabele is nuttig in Nginx serverblokken met server_name directives. Hier is een voorbeeld:

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

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

Deze configuratie gebruikt $host voor flexibele document root paden. Voor verzoeken aan "example.com" serveert Nginx bestanden vanaf "/var/www/example.com". Voor "www.example.com" gebruikt het "/var/www/www.example.com".

Deze aanpak:

  • Handelt meerdere domeinen af in één serverblok
  • Vereenvoudigt de configuratie voor sites met vergelijkbare structuren
  • Maakt het toevoegen van nieuwe domeinen gemakkelijker

$http_host voor Logging en Redirects

$http_host is nuttig voor logging en redirects. Hier is hoe het te gebruiken in access logs:

log_format custom '$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 custom;

Deze configuratie voegt $http_host toe aan je access logs, waarbij de hostnaam wordt getoond die clients gebruiken om toegang te krijgen tot je server.

Voor redirects helpt $http_host om de originele hostnaam te behouden:

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

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

Deze setup leidt "www.example.com" om naar "example.com", waarbij het originele protocol ($scheme) en pad ($request_uri) behouden blijven. Het gebruik van $http_host behoudt de exacte hostnaam uit het verzoek van de client, wat belangrijk is voor nauwkeurige redirects.