Comment transmettre les paramètres de chaîne de requête via Nginx Proxy_Pass ?

Publié 13 octobre 2024

Problème : Transfert des paramètres de chaîne de requête dans Nginx

Lors de l'utilisation de Nginx comme proxy inverse, le passage des paramètres de chaîne de requête de la requête d'origine au serveur backend peut être compliqué. Ce problème survient souvent lors de la configuration de la directive proxy_pass, car le comportement par défaut ne conserve pas toujours ces paramètres.

Mise en œuvre du transfert de chaîne de requête dans Nginx Proxy_Pass

Méthode 1 : Utilisation d'un bloc location simple

L'approche du bloc location offre un moyen de transférer les paramètres de chaîne de requête dans Nginx. Cette méthode utilise une directive location avec une barre oblique à la fin de l'instruction proxy_pass.

Étapes de configuration :

  1. Ouvrez votre fichier de configuration Nginx.
  2. Ajoutez ou modifiez le bloc location :
location /service/ {
    proxy_pass http://apache/;
}
  1. La barre oblique à la fin de proxy_pass http://apache/; indique à Nginx de remplacer /service/ par / lors du transfert de la requête.
  2. Cette configuration transfère les paramètres de chaîne de requête sans modifications supplémentaires.

Conseil: Test du transfert de chaîne de requête

Pour vérifier si le transfert de chaîne de requête fonctionne correctement, vous pouvez utiliser un outil comme curl ou les outils de développement de votre navigateur. Essayez d'accéder à une URL avec des paramètres de requête, par exemple : http://votre-domaine.com/service/page?param1=valeur1&param2=valeur2. Vérifiez si ces paramètres sont correctement transmis à votre serveur backend.

Méthode 2 : Utilisation d'expressions régulières avec des paramètres de requête

Pour des scénarios plus complexes, l'utilisation d'expressions régulières avec des paramètres de requête offre plus de flexibilité.

Étapes de configuration :

  1. Ouvrez votre fichier de configuration Nginx.
  2. Ajoutez ou modifiez le bloc location en utilisant une regex :
location ~* ^/service/(.*) {
    proxy_pass http://apache/$1$is_args$args;
}
  1. Le ~* indique une correspondance d'expression régulière insensible à la casse.
  2. ^/service/(.*) capture tout ce qui suit /service/ dans l'URL.
  3. $1 dans proxy_pass fait référence au groupe capturé.
  4. $is_args$args ajoute la chaîne de requête à l'URL proxifiée.

Cette méthode permet un meilleur contrôle sur la réécriture d'URL tout en conservant les paramètres de chaîne de requête.

Considérations supplémentaires pour la configuration de Nginx Proxy_Pass

Préservation des informations de requête d'origine

Lors de l'utilisation de proxy_pass, il est important de conserver la requête d'origine intacte. Voici quelques moyens d'y parvenir :

  1. Utilisez les directives proxy_set_header :

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    Ces en-têtes envoient les informations du client d'origine au serveur backend.

  2. Activez proxy_buffering :

    proxy_buffering on;

    Cela permet à Nginx de mettre en mémoire tampon les réponses du serveur backend, améliorant ainsi les performances.

  3. Définissez des délais d'attente :

    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;

    Ces paramètres gèrent les temps de connexion entre Nginx et le serveur backend.

Conseil: Préserver le chemin d'URL

Pour conserver le chemin d'URL d'origine lors du proxy des requêtes, utilisez la variable $request_uri :

location /api/ {
    proxy_pass http://backend$request_uri;
}

Cela garantit que le chemin complet après /api/ est envoyé au serveur backend.

Gestion de SSL/TLS dans les configurations de proxy

Pour les configurations proxy_pass sécurisées, considérez ces pratiques :

  1. Utilisez SSL/TLS pour les connexions backend :

    server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate /chemin/vers/cert.pem;
    ssl_certificate_key /chemin/vers/key.pem;
    
    location / {
        proxy_pass https://backend;
        proxy_ssl_verify on;
        proxy_ssl_trusted_certificate /chemin/vers/trusted_ca_cert.pem;
    }
    }

    Cette configuration utilise HTTPS pour la connexion proxy_pass et vérifie le certificat du serveur backend.

  2. Définissez les protocoles et les chiffrements SSL :

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    Ces paramètres limitent les protocoles SSL/TLS et les chiffrements aux options sécurisées.

  3. Activez HSTS (HTTP Strict Transport Security) :

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    Cet en-tête indique aux navigateurs d'utiliser toujours HTTPS pour votre domaine.