nginx passant en-tête personnalisé

13

J'ai l'exemple suivant

           location / {
                    proxy_read_timeout 2000;
                    proxy_next_upstream error;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header Host $http_host;
                    proxy_pass_header X_CUSTOM_HEADER;
                    proxy_redirect off;
                    proxy_max_temp_file_size 0;
                    proxy_pass https://prod;
                    break;
            }

Maintenant, quand j'utilise la ligne de bouclage suivante

curl --head -H "X_CUSTOM_HEADER: foo" http://domain.com/api/test

Maintenant cela ne fonctionne pas .. l'apache / php sur le backend ne voit pas l'en-tête. Si je contourne nginx ça marche

curl --head -H "X_CUSTOM_HEADER: foo" http://web1.domain.com/api/test
Mike
la source

Réponses:

15

Vous devez utiliser la underscores_in_headers ondirective qui est désactivée par défaut.

AlexD
la source
Cette info me fait gagner des heures.
Morgan Cheng
Je serais ravi de vous acheter une boisson rafraîchissante.
ballmw
vous monsieur, êtes un savant et un gentleman.
Eve Freeman le
2

Vous devez utiliser proxy_set_headerpour tous les en-têtes que vous souhaitez transmettre aux serveurs principaux. Donc au lieu de la proxy_pass_header ...ligne:

proxy_set_header X_CUSTOM_HEADER $http_x_custom_header;
Mikko
la source
J'ai essayé cela et il ne définit pas correctement l'en-tête, si je remplace $ http_x_custom_header par "foo" cela fonctionne
Mike
Je ne sais pas pourquoi cela n'a pas fonctionné pour @Mike mais cela a fonctionné pour moi. J'utilise X-Forwarded-Proto avec $ http_x_forwarded_proto.
Tyler Collier
2

Ce qui précède n'a pas fonctionné pour moi non plus, j'ai donc utilisé proxy_pass_header. Voir le wiki Nginx sur proxy_pass_header ici .

Si votre en-tête personnalisé est device_idajouté proxy_pass_header device_id;à votre bloc proxy.

Si vous utilisez des en-têtes personnalisés avec un trait de soulignement (comme je le suis), assurez-vous de l'avoir underscores_in_headers ondans votre configuration Nginx.

user2700022
la source
Merci beaucoup !
J'arrachais
1

Par défaut, le nginx transmet tous les ( proxy_pass_request_headers sur; ) l'en-tête au serveur principal. Mais si votre en-tête de demande (peut être un en-tête personnalisé) inclut un trait de soulignement (_) dans le nom de l'en-tête, alors nginx bloque ces en-têtes.

Ex: authenticate_type, cdn_enable.

Pour permettre à Nginx de transmettre tout ou l'en-tête demandé personnalisé au backend, activez l'option de soulignement.

underscores_in_headers on;
GangaRam Dewasi
la source