En-tête personnalisé vers l'avant du proxy inverse Nginx


25

J'ai un serveur Web nginx agissant comme un proxy inverse pour transmettre les demandes à Apache pour une gestion supplémentaire (je vous prie de ne pas demander pourquoi). J'ai une demande à laquelle j'essaie de joindre un en-tête personnalisé et j'aimerais que nginx transmette cet en-tête personnalisé à Apache afin que je puisse faire quelque chose avec dans une application.

J'ai fouillé dans les HttpProxyModuledocuments, mais ils ne sont pas très descriptifs même si je suis au bon endroit (il se pourrait très bien que je ne le sois pas).

Comment puis-je demander à nginx de transmettre un en- X-CUSTOM-REFERRERtête? De plus, si possible, j'aimerais qu'il soit transmis le long de tout en- tête personnalisé qui entre. Si ce dernier est trop demander, le premier suffirait à mes besoins actuels.

Comme vous pouvez le voir, je suis très nouveau sur nginx, donc la version corrective serait utile.

Merci.

MISE À JOUR

L'extrait pertinent de ma configuration existante:

location / {
    proxy_pass                  http://preview;
    proxy_redirect              off;
    proxy_set_header            Host $host;
    proxy_set_header            X-Real-IP $remote_addr;
    proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
    # proxy_set_header            X-Custom-Referrer $x_custom_referrer;
}

Réponses:


20

La proxy_set_headerdirective du HttpProxyModule vous permet de le faire. Par exemple:

proxy_pass http://apachehost;
proxy_set_header X-Custom-Referrer $proxy_add_<header_field_name_from_last_request>;

1
Merci, @mgorven. La valeur entrante est cependant variable. Puis-je lire une valeur de l'en- X-Custom-Referrertête entrant et la transmettre? proxy_set_header X-Custom-Referrer $x_custom_referrerOu quelque chose à cet effet?
Rob Wilkerson

1
Oui, vous pouvez utiliser $http_x_custom_referrer. Cependant, tous les en-têtes envoyés par le client doivent être transmis automatiquement au backend. Avez-vous mis proxy_pass_request_headers offquelque part?
mgorven

Pas que je puisse voir. J'ai mis à jour ma question avec un extrait de mon fichier de configuration. Cependant, cet en-tête ne parvient pas à l'application. Cela dit, je suppose que les applications source l'envoient, alors je ferai mon devoir de diligence et je serai sûr que ce soit le comportement par défaut.
Rob Wilkerson

@RobWilkerson dans votre extrait de code, le correspondant proxy_set_headerest mis en commentaire; vous utilisez également $x_custom_referrerau lieu de $http_x_custom_referrer...
severin

Je pense que la réponse de @ mgorven devrait être mise à jour pour être $http_<custom_header_field>au lieu de$proxy_add_<custom_header_field>
Tri Nguyen

2

Le module ngx_headers_more vous permet de modifier et d'ajouter des en-têtes http.


Ce module ajoute des en-têtes à la réponse. Ce n'est pas ce que le PO demande. Ils doivent envoyer un en-tête supplémentaire à l'amont, en a proxy_pass.
Victor Schröder

1

Vous pouvez utiliser des en-têtes en amont (nommés en commençant par $ http_) et des en-têtes personnalisés supplémentaires. Par exemple:

add_header X-Upstream-01 $http_x_upstream_01;
add_header X-Hdr-01  txt01;

Ensuite, allez dans la console et faites une demande avec l'en-tête de l'utilisateur:

curl -H "X-Upstream-01: HEADER1" -I http://localhost:11443/

la réponse contient X-Hdr-01, défini par le serveur et X-Upstream-01, défini par le client:

HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Mon, 30 Nov 2015 23:54:30 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
X-Hdr-01: txt01
X-Upstream-01: HEADER1

1
Cela définit des en-têtes sur la réponse. Le PO souhaite définir des en-têtes à envoyer en amont d'une proxy_passdirective.
Victor Schröder
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.