Comment lire un header personnalisé d'un serveur upstream dans Nginx ?

Publié 17 octobre 2024

Problème : Lire des en-têtes personnalisés des serveurs en amont dans Nginx

Nginx, un serveur web et proxy inverse, doit parfois accéder à des en-têtes personnalisés provenant de serveurs en amont. Ces en-têtes peuvent contenir des informations importantes pour le traitement des requêtes ou la journalisation. Par défaut, Nginx n'expose pas automatiquement tous les en-têtes en amont, ce qui peut poser problème aux administrateurs qui ont besoin de ces données.

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

Utilisation des variables Nginx pour l'accès aux en-têtes

Nginx offre un moyen d'accéder aux en-têtes personnalisés des serveurs en amont. Cette méthode utilise des variables Nginx, qui sont des valeurs pouvant être utilisées dans différentes parties de la configuration Nginx.

Pour accéder aux en-têtes personnalisés, Nginx utilise un préfixe : $senthttp. Ce préfixe permet de créer des variables correspondant à des en-têtes spécifiques envoyés par le serveur en amont. Le préfixe est suivi du nom de l'en-tête que vous souhaitez accéder, avec les tirets remplacés par des underscores.

Par exemple, pour accéder à un en-tête personnalisé nommé "My-Custom-Header", vous utiliseriez la variable Nginx $sent_http_My_Custom_Header. Cette variable contiendra la valeur de "My-Custom-Header" envoyée par le serveur en amont.

Cette méthode fonctionne pour tout en-tête personnalisé, ce qui en fait un outil utile pour les administrateurs Nginx qui doivent travailler avec différents types de réponses de serveurs en amont.

Exemple: Journalisation des en-têtes personnalisés

Pour enregistrer la valeur d'un en-tête personnalisé dans le journal d'accès de Nginx, vous pouvez l'ajouter à la directive log_format dans votre configuration Nginx :

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

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

Cette configuration inclura la valeur de "My-Custom-Header" dans chaque entrée du journal.

Guide étape par étape pour lire les en-têtes personnalisés

Identifier l'en-tête personnalisé

Pour lire des en-têtes personnalisés dans Nginx, vous devez trouver l'en-tête dans la réponse du serveur en amont. Les en-têtes personnalisés sont souvent ajoutés par le serveur en amont (comme Apache ou un serveur d'application) pour fournir des informations supplémentaires.

Dans cet exemple, l'en-tête personnalisé est :

My-custom-header: 1

Cet en-tête fait partie de la réponse HTTP du serveur en amont. Notez le nom et le format de l'en-tête personnalisé, car vous aurez besoin de ces informations pour y accéder dans Nginx.

Conseil: Conventions de nommage des en-têtes

Lors de la création d'en-têtes personnalisés, utilisez une convention de nommage cohérente. Une pratique courante consiste à préfixer vos en-têtes personnalisés avec 'X-' (par exemple, X-My-Custom-Header). Cela aide à les distinguer des en-têtes HTTP standard et évite les conflits potentiels.

Construire la variable Nginx

Après avoir trouvé l'en-tête personnalisé, vous devez créer la variable Nginx correcte pour accéder à sa valeur. Nginx utilise un format spécifique pour les variables représentant les en-têtes de réponse :

  1. Commencez par le préfixe $sent_http_
  2. Ajoutez le nom de l'en-tête, en remplaçant les tirets par des underscores
  3. Le nom de la variable n'est pas sensible à la casse

Pour l'en-tête personnalisé "My-custom-header", la variable Nginx correcte serait :

$sent_http_My_custom_header

Cette variable contiendra la valeur de "My-custom-header" envoyée par le serveur en amont. Dans ce cas, elle contiendrait la valeur "1".

Mise en œuvre de l'en-tête personnalisé dans la configuration Nginx

Ajout de l'en-tête au bloc de localisation Nginx

Pour utiliser la variable d'en-tête personnalisé dans un bloc de localisation, ajoutez-la à votre fichier de configuration Nginx. Cela vous permet d'accéder à la valeur de l'en-tête dans cette localisation.

Voici comment utiliser la variable d'en-tête personnalisé dans un bloc de localisation :

location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;

    # Accès à la valeur de l'en-tête personnalisé
    add_header X-Custom-Header-Value $sent_http_My_custom_header;
}

Dans cette configuration, la valeur de l'en-tête personnalisé "My-custom-header" du serveur en amont est ajoutée à la réponse envoyée au client en utilisant la directive add_header.

Conseil: Journaliser les en-têtes personnalisés

Pour dépanner ou surveiller les en-têtes personnalisés, vous pouvez les journaliser dans le journal d'accès de Nginx :

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

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

Cela inclura la valeur de l'en-tête personnalisé dans chaque entrée du journal, facilitant ainsi le suivi et le débogage.

Utilisation des en-têtes personnalisés dans les instructions conditionnelles

Vous pouvez utiliser les valeurs des en-têtes personnalisés dans des instructions conditionnelles dans votre configuration Nginx. Cela vous permet de prendre des décisions basées sur la valeur de l'en-tête.

Voici des exemples d'utilisation des en-têtes personnalisés dans la logique conditionnelle :

  1. Redirection basée sur la valeur de l'en-tête :
location / {
    if ($sent_http_My_custom_header = "1") {
        return 301 /special-page;
    }
    # Le traitement régulier continue ici
}
  1. Modification de la réponse basée sur la valeur de l'en-tête :
location / {
    proxy_pass http://backend;

    if ($sent_http_My_custom_header = "premium") {
        add_header X-User-Type "Premium";
    }
}
  1. Contrôle d'accès basé sur la valeur de l'en-tête :
location /restricted {
    if ($sent_http_My_custom_header != "authorized") {
        return 403;
    }
    # L'accès autorisé continue ici
}

Ces exemples montrent comment vous pouvez utiliser la valeur de l'en-tête personnalisé pour contrôler le comportement de votre serveur Nginx, permettant des configurations plus complexes et dynamiques basées sur les réponses du serveur en amont.