Comment ajouter un custom response header dans Nginx avec proxy_pass ?

Publié 17 octobre 2024

Problème : Ajouter des en-têtes de réponse personnalisés avec Nginx et proxy_pass

L'ajout d'en-têtes de réponse personnalisés dans Nginx lors de l'utilisation de proxy_pass peut être délicat. Cette configuration est souvent nécessaire pour ajouter des informations spécifiques ou modifier la réponse d'un serveur en amont avant qu'elle n'atteigne le client.

Utilisation de add_header avec proxy_pass

Configuration de Nginx pour les en-têtes personnalisés

La directive add_header dans Nginx fonctionne avec proxy_pass, permettant d'ajouter des en-têtes personnalisés aux réponses des serveurs en amont. Cette fonctionnalité est utile pour ajouter des informations supplémentaires ou modifier la réponse avant qu'elle n'atteigne le client.

Pour utiliser add_header avec proxy_pass, incluez-le dans le même bloc location que votre directive proxy_pass. Voici un exemple de configuration Nginx :

server {
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        add_header X-Custom-Header "Valeur personnalisée";
    }
}

Dans cette configuration, Nginx ajoutera l'en-tête X-Custom-Header avec la valeur "Valeur personnalisée" à toutes les réponses du backend_server. Cet en-tête sera inclus dans la réponse envoyée au client, que la réponse soit générée par Nginx ou par le serveur en amont.

La directive add_header s'applique au niveau actuel et à tous les niveaux inférieurs, sauf si elle est remplacée. Si vous souhaitez ajouter des en-têtes uniquement pour des emplacements spécifiques, placez la directive add_header dans le bloc location approprié.

Conseil: En-têtes conditionnels

Vous pouvez utiliser des variables Nginx pour ajouter des en-têtes de manière conditionnelle. Par exemple :

location / {
    proxy_pass http://backend_server;
    add_header X-Response-Time $request_time;
    add_header X-Cache-Status $upstream_cache_status;
}

Cette configuration ajoute le temps de réponse et le statut du cache comme en-têtes personnalisés, fournissant des informations utiles pour le débogage.

Mise en œuvre de la solution

Guide étape par étape

Pour ajouter des en-têtes personnalisés lors de l'utilisation de proxy_pass dans Nginx, suivez ces étapes :

  1. Modifiez le fichier de configuration Nginx : Ouvrez votre fichier de configuration Nginx avec un éditeur de texte. Le fichier se trouve généralement à /etc/nginx/nginx.conf ou /usr/local/nginx/conf/nginx.conf.

  2. Ajoutez la directive add_header : Dans le bloc server ou location, ajoutez la directive add_header. Placez-la après la directive proxy_pass pour l'appliquer aux réponses proxifiées.

  3. Définissez l'en-tête personnalisé et sa valeur : Définissez le nom et la valeur de votre en-tête personnalisé en utilisant la directive add_header. La syntaxe est :

    add_header <nom_en-tête> <valeur_en-tête>;

Voici un exemple de ce à quoi votre configuration pourrait ressembler :

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        add_header X-Custom-Header "Valeur personnalisée";
        add_header X-Served-By $hostname;
    }
}

Dans cet exemple, deux en-têtes personnalisés sont ajoutés :

  • X-Custom-Header avec une valeur statique "Valeur personnalisée"
  • X-Served-By avec la valeur de la variable $hostname, qui contient le nom du serveur Nginx

Après avoir effectué ces modifications, sauvegardez le fichier de configuration et rechargez Nginx pour appliquer les nouveaux paramètres :

sudo nginx -t
sudo nginx -s reload

La première commande vérifie la configuration pour détecter les erreurs de syntaxe, tandis que la seconde recharge Nginx avec la nouvelle configuration.

Conseil: Utilisation de variables dans les en-têtes personnalisés

Vous pouvez utiliser des variables Nginx dans vos en-têtes personnalisés pour ajouter des informations dynamiques. Par exemple :

add_header X-Request-ID $request_id;
add_header X-Client-IP $remote_addr;

Ces en-têtes incluront respectivement l'ID de requête unique et l'adresse IP du client.

Options de configuration avancées

Utilisation du paramètre 'always'

Le paramètre 'always' dans la directive add_header de Nginx vous permet d'ajouter des en-têtes personnalisés à toutes les réponses, y compris les réponses d'erreur. Cette fonctionnalité est utile lorsque vous voulez que vos en-têtes personnalisés soient présents dans chaque réponse, quel que soit le code de statut.

Par défaut, Nginx ajoute des en-têtes personnalisés uniquement aux réponses réussies (codes de statut 2xx et 3xx). Pour inclure des en-têtes personnalisés dans les réponses d'erreur (codes de statut 4xx et 5xx), utilisez le paramètre 'always'.

Voici comment utiliser le paramètre 'always' :

location / {
    proxy_pass http://backend_server;
    add_header X-Custom-Header "Valeur personnalisée" always;
}

Dans cette configuration, l'en-tête X-Custom-Header sera ajouté à toutes les réponses, y compris les réponses d'erreur.

Vous pouvez utiliser le paramètre 'always' avec plusieurs en-têtes :

location / {
    proxy_pass http://backend_server;
    add_header X-Custom-Header1 "Valeur1" always;
    add_header X-Custom-Header2 "Valeur2" always;
    add_header X-Server-Name $hostname always;
}

Cette configuration ajoute trois en-têtes personnalisés à toutes les réponses, y compris celles avec des codes de statut d'erreur.

Conseil: En-têtes conditionnels avec 'always'

Vous pouvez combiner le paramètre 'always' avec des instructions conditionnelles pour plus de contrôle :

location / {
    proxy_pass http://backend_server;
    add_header X-Cache-Status $upstream_cache_status always;
    if ($status = 404) {
        add_header X-Error-Type "Non trouvé" always;
    }
}

Cette configuration ajoute l'en-tête X-Cache-Status à toutes les réponses et un en-tête X-Error-Type uniquement pour les erreurs 404.

Exemple: Utilisation de 'always' pour les en-têtes de sécurité

Pour améliorer la sécurité, vous pouvez utiliser le paramètre 'always' pour ajouter des en-têtes de sécurité importants à toutes les réponses :

server {
    listen 80;
    server_name example.com;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Content-Security-Policy "default-src 'self';" always;

    location / {
        proxy_pass http://backend_server;
    }
}

Cet exemple ajoute plusieurs en-têtes de sécurité à toutes les réponses, aidant à protéger contre les vulnérabilités web courantes.

N'oubliez pas que l'utilisation du paramètre 'always' peut afficher des informations sensibles dans les réponses d'erreur. Vérifiez vos en-têtes personnalisés pour éviter de divulguer des données sensibles.