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é.
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é.
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
.
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
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).
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.
Comme l'écrit Oliver :
add_header
fonctionne aussi bien avecproxy_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;
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 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.