web-dev-qa-db-fra.com

Comment ajouter un en-tête de réponse sur nginx lors de l'utilisation de proxy_pass?

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

Tandis que add_header fonctionne pour les réponses traitées par nginx, il ne fait rien lorsque le proxy_pass est utilisé.

74
sorin

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

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

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

23
Sebastian Goodman

add_header fonctionne aussi bien avec proxy_pass comme sans. Je viens aujourd'hui de mettre en place une configuration dans laquelle j'ai utilisé exactement cette directive. Je dois admettre cependant que j'ai eu du mal à le mettre en place sans rappeler exactement la raison.

En ce moment, ma configuration est opérationnelle et 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.5add_header ne travaillait que sur les réponses réussies, contrairement au 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 la valeur de l'en-tête server à l'aide de add_header.

140
Oliver

Comme écrit oliver:

add_header fonctionne aussi bien avec proxy_pass comme sans.

Cependant, écrit Shane, à partir de Nginx 1.7.5, vous devez passer always pour obtenir add_header pour travailler pour les réponses d'erreur, comme ceci:

add_header  X-Upstream  $upstream_addr always;
23
Dmitry Minkovsky

Vous pouvez essayer cette solution:

Dans votre bloc 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 une manipulation de cette méthode et peut-être que le résultat conviendra à votre problème.

Aussi, vous pouvez utiliser cette combinaison:

proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;
12
emka86

Masquer l'en-tête de la réponse, puis ajouter une nouvelle valeur d'en-tête personnalisé

L'ajout d'un en-tête avec add_header Fonctionne correctement avec un proxy, mais s'il existe une valeur d'en-tête dans la réponse, elle empilera les valeurs.

Si vous souhaitez définir ou remplacer une valeur d'en-tête (par exemple, remplacez l'en-tête Access-Control-Allow-Origin Afin qu'il corresponde à votre client autorisant le partage de ressources inter-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 *;

Ainsi, proxy_hide_header Associé à 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

3
Wilt