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

90

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

Bien que add_headerfonctionne pour les réponses traitées par nginx, il ne fait rien lorsque le proxy_passest utilisé.

Sorin
la source
Donc, vous transmettez la demande au proxy et cette réponse d'ensemble de proxy et sur cette réponse, vous souhaitez ajouter votre en-tête personnalisé avant qu'il ne soit envoyé à l'utilisateur, c'est correct?
emka86

Réponses:

29

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

Sebastian Goodman
la source
est-il possible d'ajouter Secureet des HttpOnlyindicateurs sur un cookie de réponse ? Le cookie de réponse cible n'a cependant que le cookie nameet les expireattributs.
JPaulPunzalan
2
Vous n'avez pas nécessairement besoin d'une bibliothèque pour pouvoir modifier ou ajouter des en-têtes de réponse et contrairement à la réponse la plus votée, vous pouvez remplacer un en-tête, vous devez simplement le supprimer d'abord. Vérifiez ma réponse ci-dessous pour plus de détails.
Wilt
155

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

À l'heure actuelle, j'ai une configuration de travail et elle 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 add_header ne fonctionnait que sur les réponses réussies, contrairement au HttpHeadersMoreModule mentionné par Sebastian Goodman dans sa réponse .

Depuis nginx, 1.7.5vous pouvez utiliser le mot-clé alwayspour 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 servervaleur d'en-tête avec add_header.

Oliver
la source
40
Depuis nginx 1.7.5, vous pouvez utiliser "always" pour inclure des en-têtes personnalisés dans les réponses d'erreur en utilisant add_header:add_header X-Upstream $upstream_addr always;
Shane
Quoi qu'il en soit, avoir des fonctionnalités similaires sans exposer la combinaison IP / port du serveur mandaté? par exemple X-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5 n'est probablement pas utile pour masquer l'infrastructure, mais il transmet l'idée).
zamnuts
@zamnuts: La transmission de l'adresse IP et des numéros de port en amont n'est qu'un exemple d'utilisation de la add_headerdirective. Vous n'avez pas du tout à les envoyer.
Oliver
@Oliver, j'en suis conscient, mais je me suis renseigné sur un autre identifiant individuel / unique en amont autre que les numéros IP / port, ou un obscurcissement de celui-ci. Peut-être que ma question est hors de propos et que je devrais créer un nouveau message :)
zamnuts
@zamnuts: Je suggérerais de poser une nouvelle question aussi :-)
Oliver
25

Comme l'écrit oliver:

add_headerfonctionne aussi bien avec proxy_passque sans.

Cependant, comme l'écrit Shane, à partir de Nginx 1.7.5, vous devez réussir alwayspour se mettre add_headerau travail pour les réponses d'erreur, comme ceci:

add_header  X-Upstream  $upstream_addr always;
Dmitry Minkovsky
la source
5
J'ai passé un long moment à me demander pourquoi mes en-têtes ne s'affichaient pas, à essayer de les déplacer dans le bloc serveur, le bloc d'emplacement, ... et voici la raison: nginx ne les ajoute pas sur les réponses d'erreur: F Merci
Shautieh
Moi aussi :) et malgré cette réponse, cela m'est arrivé à nouveau l'autre jour. J'ai dû revoir ma propre réponse.
Dmitry Minkovsky
14

Vous pouvez essayer cette solution:

Dans votre locationbloc, lorsque vous utilisez, proxy_passfaites quelque chose comme ceci:

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.

Vous pouvez également utiliser cette combinaison:

proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;
emka86
la source
6
J'ai dû utiliser cette méthode car nginx ajoutait un en-tête en double plutôt que d'écraser celui qui sortait. location / { proxy_pass http://127.0.0.1:8080/; proxy_hide_header "Access-Control-Allow-Origin"; if ($http_origin ~* "^https://(example.com|www.example.com)$") { add_header Access-Control-Allow-Origin "$http_origin"; } }
ether6
11

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

L'ajout d'un en-tête avec add_headerfonctionne bien avec le proxy pass, mais s'il existe une valeur d'en-tête existante 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- Access-Control-Allow-Origintête pour qu'il corresponde à votre client pour autoriser le partage de 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 *;

Ainsi proxy_hide_headercombiné avec add_headervous donne le pouvoir de définir / remplacer les valeurs d'en-tête de réponse.

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

METTRE À JOUR:

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

Se flétrir
la source
Merci, grande aide
Lancer.Yan