Изменить заголовок узла в обратном прокси-сервере nginx

Я запускаю nginx в качестве обратного прокси для сайта example.com для балансировки рубинового приложения, работающего на сервере backend. У меня есть следующее поле proxy_set_header в nginx, которое передаст заголовки хоста для бэкэнд-рубина. Это необходимо для приложения ruby ​​для идентификации имен поддоменов.

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

Теперь я хочу создать псевдоним beta.example.com, но заголовок хоста, переданный на бэкэнд, должен быть www.example.com, иначе приложение ruby ​​отклонит запросы. Поэтому я хочу, чтобы что-то похожее ниже директивы внутри места.

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

Каков наилучший способ сделать это?

Ответы

Ответ 1

Вы не можете использовать proxy_pass в блоке, поэтому я предлагаю сделать что-то подобное перед настройкой заголовка прокси-сервера:

set $my_host $http_host;
if ($http_host = "beta.example.com") {
  set $my_host "www.example.com";
}

И теперь вы можете просто использовать proxy_pass и proxy_set_header без блока:

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

Ответ 2

map лучше, чем 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;
    }
}

Ответ 3

Просто маленький совет. Иногда вам может понадобиться использовать X-Forwarded-Host вместо заголовка Host. Это был мой случай, когда заголовок Host работал, но только для стандартного порта HTTP 80. Если приложение было выставлено на нестандартном порту, то этот порт был потерян, когда приложение генерировало перенаправления. И наконец то, что сработало для меня:

proxy_set_header X-Forwarded-Host $http_host;

Ответ 4

Я пытался решить ту же ситуацию, но с помощью uwsgi_pass.

После некоторых исследований я выяснил, что в этом сценарии требуется:

uwsgi_param HTTP_HOST $my_host;

Надеюсь, это поможет кому-то еще.