web-dev-qa-db-fra.com

Transférer les en-têtes de requête du serveur proxy nginx

J'utilise Nginx en tant que proxy pour filtrer les demandes de mon application. Avec l'aide de "http_geoip_module", je crée un en-tête http de code de pays et je souhaite le transmettre comme en-tête de requête à l'aide de "en-têtes-more-nginx-module". Voici le bloc d’emplacement dans la configuration de Nginx:

location / {
    proxy_pass                      http://mysite.com;
    proxy_set_header                Host http://mysite.com;;
    proxy_pass_request_headers      on;
    more_set_headers 'HTTP_Country-Code: $geoip_country_code';
}

Mais cela ne définit que l'en-tête dans la réponse. J'ai essayé d'utiliser "more_set_input_headers" au lieu de "more_set_headers" mais l'en-tête n'est même pas transmis à la réponse.

Qu'est-ce que j'oublie ici?

53
Peleg

Si vous souhaitez transmettre la variable à votre serveur proxy, vous devez la définir avec le module proxy.

location / {
    proxy_pass                      http://example.com;
    proxy_set_header                Host example.com;
    proxy_set_header                HTTP_Country-Code $geoip_country_code;
    proxy_pass_request_headers      on;
}

Et maintenant, il est passé au serveur proxy.

87
Fleshgrinder

Le problème est que les traits de soulignement '_' ne sont pas valides dans l'attribut d'en-tête. Si la suppression du trait de soulignement n'est pas une option, vous pouvez ajouter au bloc du serveur:

underscores_in_headers on;

Il s’agit essentiellement d’un copier-coller du commentaire de @ kishorer747 sur la réponse de @Fleshgrinder, et la solution provient de: https://serverfault.com/questions/586970/nginx-is-not-forwarding-a-header-value -when-using-proxy-pass/586997 # 586997

Je l'ai ajouté ici car, dans mon cas, l'application derrière nginx fonctionnait parfaitement, mais dès que ngix se situait entre mon flask app et le client, mon flask L’application ne verrait plus les en-têtes, c’était un peu fastidieux de déboguer.

18
Peter Senna