web-dev-qa-db-fra.com

Changer l'en-tête de l'hôte dans le proxy inverse nginx

J'exécute nginx en tant que proxy inverse pour le site example.com afin d'équilibrer une application Ruby exécutée sur un serveur dorsal. J'ai le champ proxy_set_header suivant dans nginx qui passera les en-têtes de l'hôte au serveur Ruby. Ceci est requis par l'application Ruby pour identifier les noms de sous-domaines.

location / {
    proxy_pass http://rubyapp.com;
    proxy_set_header Host $http_Host;
}

Maintenant, je veux créer un alias beta.example.com, mais l'en-tête de l'hôte transmis au serveur doit toujours être www.example.com, sinon l'application Ruby rejettera les demandes. Je veux donc quelque chose de similaire à la directive ci-dessous concernant l'emplacement intérieur.

if ($http_Host = "beta.example.com") {
    proxy_pass http://rubyapp.com;
    proxy_set_header Host www.example.com;
}

Quelle est la meilleure façon de procéder?

18
Basil

Vous ne pouvez pas utiliser proxy_pass dans if block, je suggère donc de faire quelque chose comme ceci avant de définir l'en-tête de proxy:

set $my_Host $http_Host;
if ($http_Host = "beta.example.com") {
  set $my_Host "www.example.com";
}

Et maintenant, vous pouvez simplement utiliser proxy_pass et proxy_set_header sans si bloc:

location / {
  proxy_pass http://rubyapp.com;
  proxy_set_header Host $my_Host;
}
22
emka86

map vaut mieux que set + if.

map $http_Host $served_Host {
    default $http_Host;
    beta.example.com www.example.com;
}

server {
    [...]

    location / {
        proxy_pass http://rubyapp.com;
        proxy_set_header Host $served_Host;
    }
}
17
Bernard Rosset

Juste un petit pourboire. Parfois, vous devrez peut-être utiliser X-Forwarded-Host au lieu de Host header. C'était mon cas où Host header fonctionnait, mais uniquement pour le port HTTP standard 80. Si l'application était exposée sur un port non standard, ce port était perdu lors de la génération des redirections. Alors finalement, ce qui a fonctionné pour moi a été:

proxy_set_header X-Forwarded-Host $http_Host;
0
TomCZ

J'essayais de résoudre la même situation, mais avec uwsgi_pass.

Après quelques recherches, j'ai compris que, dans ce scénario, il est nécessaire de:

uwsgi_param HTTP_Host $my_Host;

J'espère que ça aide quelqu'un d'autre.

0
ricardorover