it-swarm.com.de

Ändern Sie den Host-Header in Nginx Reverse Proxy

Ich verwende Nginx als Reverse-Proxy für die Site example.com, um eine auf Backend-Server ausgeführte Ruby-Anwendung zu laden. Ich habe das folgende proxy_set_header-Feld in nginx, das Host-Header an das Backend-Ruby übergeben wird. Dies ist für die Ruby-App erforderlich, um die Namen der Unterdomänen zu identifizieren.

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

Jetzt möchte ich einen Alias ​​beta.example.com erstellen, aber der Host-Header, der an das Backend übergeben wird, sollte weiterhin www.example.com sein. Andernfalls lehnt die Ruby-Anwendung die Anforderungen ab. Ich möchte also etwas Ähnliches wie unten in der Standortanweisung.

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

Was ist der beste Weg, dies zu tun?

18
Basil

Sie können nicht verwenden proxy_pass im if-Block, so empfehle ich vor dem Setzen des Proxy-Headers Folgendes:

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

Und jetzt kannst du es einfach benutzen proxy_pass und proxy_set_header ohne if-Block:

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

map ist besser als 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

Nur ein kleiner Tipp. Manchmal müssen Sie X-Forwarded-Host anstelle von Host Header verwenden. In diesem Fall funktionierte der Hostheader nur für den Standard-HTTP-Port 80. Wenn die App für einen nicht standardmäßigen Port verfügbar gemacht wurde, ging dieser Port verloren, als die App Weiterleitungen generierte. Was schließlich für mich funktionierte, war:

proxy_set_header X-Forwarded-Host $http_Host;
0
TomCZ

Ich habe versucht, die gleiche Situation zu lösen, aber mit uwsgi_pass.

Nach einiger Recherche habe ich herausgefunden, dass es in diesem Szenario erforderlich ist:

uwsgi_param HTTP_Host $my_Host;

Hoffe es hilft jemand anderem.

0
ricardorover