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


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.


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.


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;

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;

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


Merci, grande aide
Lancer.Yan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.