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 :
-
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
. -
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.
-
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.