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é.
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.
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.5
add_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
.
Comme écrit oliver:
add_header
fonctionne aussi bien avecproxy_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;
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;
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