97 votes

nginx - lire l'en-tête personnalisé du serveur en amont

J'utilise nginx comme proxy inverse et j'essaie de lire un en-tête personnalisé à partir de la réponse d'un serveur en amont (Apache), sans succès. La réponse d'Apache est la suivante :

HTTP/1.0 200 OK
Date: Fri, 14 Sep 2012 20:18:29 GMT 
Server: Apache/2.2.17 (Ubuntu)
X-Powered-By: PHP/5.3.5-1ubuntu7.10
Connection: close
Content-Type: application/json; charset=UTF-8
My-custom-header: 1

Je veux lire la valeur de Mon en-tête personnalisé et l'utiliser dans une clause if :

location / {
    // ...
    // get My-custom-header value here
    // ...
}

Est-ce possible ? Merci d'avance.

109voto

cobaco Points 2981

Ce n'est pas seulement possible, c'est facile :

dans nginx, les valeurs des en-têtes de réponse sont disponibles via une variable (une par en-tête). Voir http://wiki.nginx.org/HttpCoreModule#.24sent_http_HEADER pour les détails sur ces variables.

Dans votre exemple, la variable serait $sent_http_My_custom_header.

60voto

Dev Gosain Points 650

J'étais confronté au même problème. J'ai essayé les deux $http_my_custom_header y $sent_http_my_custom_header mais cela n'a pas fonctionné pour moi.

Bien que ce problème ait été résolu en utilisant $upstream_http_my_custom_header .

28voto

Martijn Pieters Points 271458

Lorsque l'on utilise NGINX en tant que proxy, il y a quatre des ensembles d'en-têtes :

  • client -> nginx : t demande en-têtes
  • nginx -> upstream : l'amont demande en-têtes
  • upstream -> nginx : l'amont réponse en-têtes
  • nginx -> client : t réponse en-têtes

Il semble que votre question porte sur les en-têtes de réponse en amont. Ceux-ci se trouvent dans le fichier $upstream_http__name_ variables .

Cependant il faut tenir compte du fait que toute réponse Les en-têtes sont uniquement définis après les en-têtes de la réponse du serveur en amont ont été reçus. Tout if directives sont exécutés avant d'envoyer la demande en amont et n'aura pas accès aux en-têtes de réponse ! En d'autres termes, if sont exécutées après la réception de la demande du client, avant d'effectuer la demande en amont.

Si vous devez modifier la façon dont une réponse est gérée, vous pouvez utiliser un fichier de type map directive cependant pour définir des variables basées sur les en-têtes de réponse, puis d'utiliser ces variables dans la section add_header (définir les en-têtes de réponse du client), log_format ou toute autre directive qui est active pendant les phases de réponse (nommée en interne les NGX_HTTP_CONTENT_PHASE y NGX_HTTP_LOG_PHASE phases ). Pour un contrôle plus complexe, vous devrez utiliser un module complémentaire de script tel que le module Module Lua (par exemple, en utilisant un header_filter_by_lua_block directive ).

Pour lire ou définir des en-têtes individuels, utilisez :

de

à

type

lire (variable)

écrire (directive)

client

nginx

demande

$http__name_

-

ngnix

en amont

demande

-

proxy_set_header

en amont

nginx

réponse

$upstream_http__name_

-

nginx

client

réponse

$sent_http__name_

add_header

NGINX copie certains en-têtes de la requête du client vers la requête en amont, et de la réponse en amont vers la réponse du client, en utilisant différentes méthodes proxy_ directives , vous donnant la possibilité d'omettre ou d'inclure explicitement les en-têtes dans les deux sens. Ainsi, si un en-tête de réponse en amont se trouve uniquement dans $upstream_http__name_ alors ces en-têtes n'ont pas été copiés dans la réponse du client et l'ensemble des variables disponibles $sent_http__name_ comprendront toutes les variables extra les en-têtes définis par NGINX qui ne sont pas présents dans la réponse en amont.

11voto

Vladimir Points 221

Utiliser $http_MY_CUSTOM_HEADER

Vous pouvez écrire quelque chose comme

set my_header $http_MY_CUSTOM_HEADER;
if($my_header != 'some-value') {
#do some thing;
}

Prograide.com

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.

Powered by:

X