123 votes

Comment ajouter un en-tête de réponse sur nginx en utilisant proxy_pass ?

Je veux ajouter un en-tête personnalisé pour la réponse reçue du serveur derrière nginx.

Alors que add_header fonctionne pour les réponses traitées par nginx, mais ne fait rien lorsque le paramètre proxy_pass est utilisé.

205voto

Oliver Points 1863

add_header fonctionne aussi bien avec proxy_pass que sans. Je viens aujourd'hui de mettre en place une configuration où j'ai utilisé exactement cette directive. Je dois cependant admettre que j'ai également eu du mal à mettre en place cette configuration sans me souvenir exactement de la raison.

Actuellement, j'ai une configuration qui fonctionne et qui contient les éléments suivants (entre autres) :

server {
    server_name  .myserver.com
    location / {
        proxy_pass  http://mybackend;
        add_header  X-Upstream  $upstream_addr;
    }
}

Avant nginx 1.7.5 ajouter_en-tête ne travaillait que sur les réponses réussies, contrairement à la HttpHeadersMoreModule mentionné par Sebastian Goodman dans sa réponse .

Depuis nginx 1.7.5 vous pouvez utiliser le mot-clé always pour inclure des en-têtes personnalisés même dans les réponses d'erreur. Par exemple :

add_header X-Upstream $upstream_addr always;

Limitation : Vous ne pouvez pas remplacer le server en utilisant la valeur de l'en-tête add_header .

38voto

Wilt Points 867

Cachez l'en-tête de réponse et ajoutez une nouvelle valeur d'en-tête personnalisée.

Ajout d'un en-tête avec add_header fonctionne bien avec le passage du proxy, mais s'il y a une valeur d'en-tête existante dans la réponse, les valeurs seront superposées.

Si vous souhaitez définir ou remplacer une valeur d'en-tête (par exemple, remplacer l'en-tête Access-Control-Allow-Origin pour correspondre à votre client afin d'autoriser le partage des ressources entre origines), vous pouvez procéder comme suit :

# 1. hide the Access-Control-Allow-Origin from the server response
proxy_hide_header Access-Control-Allow-Origin;
# 2. add a new custom header that allows all * origins instead
add_header Access-Control-Allow-Origin *;

Alors proxy_hide_header combiné avec add_header vous donne le pouvoir de définir/remplacer les valeurs des en-têtes de réponse.

Une réponse similaire peut être trouvée ici sur ServerFault

UPDATE :

Nota: proxy_set_header sert à définir les en-têtes de la demande avant que la demande ne soit envoyée plus loin, et non à définir les en-têtes de la réponse (ces attributs de configuration pour les en-têtes peuvent être un peu confus).

36voto

Sebastian Goodman Points 1675

Il existe un module appelé HttpHeadersMoreModule qui vous donne plus de contrôle sur les en-têtes. Il n'est pas fourni avec Nginx et nécessite une installation supplémentaire. Avec lui, vous pouvez faire quelque chose comme ceci :

location ... {
  more_set_headers "Server: my_server";
}

Cela va "définir l'en-tête de sortie du serveur à la valeur personnalisée pour tout code d'état et tout type de contenu". Elle remplacera les en-têtes qui sont déjà définis ou les ajoutera s'ils ne le sont pas.

35voto

dimadima Points 2803

Comme l'écrit Oliver :

add_header fonctionne aussi bien avec proxy_pass que sans.

Cependant, comme l'écrit Shane, à partir de Nginx 1.7.5, vous devez passer le code suivant always afin d'obtenir add_header pour travailler pour les réponses aux erreurs, comme ceci :

add_header  X-Upstream  $upstream_addr always;

17voto

emka86 Points 1193

Vous pouvez essayer cette solution :

Dans votre location lorsque vous utilisez proxy_pass faire quelque chose comme ça :

location ... {

  add_header yourHeaderName yourValue;
  proxy_pass xxxx://xxx_my_proxy_addr_xxx;

  # Now use this solution:
  proxy_ignore_headers yourHeaderName // but set by proxy

  # Or if above didn't work maybe this:
  proxy_hide_header yourHeaderName // but set by proxy

}

Je ne suis pas sûr que ce soit exactement ce dont vous avez besoin mais essayez de manipuler cette méthode et peut-être que le résultat correspondra à votre problème.

Vous pouvez également utiliser cette combinaison :

proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X