在nginx反向代理中更改主机头

Bas*_*sil 22 nginx

我正在运行nginx作为站点example.com的反向代理来加载在后端服务器中运行的ruby应用程序.我proxy_set_header在nginx中有以下字段,它将主机头传递给后端ruby.ruby app需要这个来识别子域名.

location / {
    proxy_pass http://rubyapp.com;
    proxy_set_header Host $http_host;
}
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个别名beta.example.com,但是传递给后端的主机头应该仍然是www.example.comruby应用程序将拒绝请求.所以我想要一些类似于下面的location location指令.

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

做这个的最好方式是什么?

emk*_*a86 26

你不能在if块中使用proxy_pass,所以我建议你在设置代理头之前做这样的事情:

set $my_host $http_host;
if ($http_host = "beta.example.com") {
  set $my_host "www.example.com";
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用proxy_passproxy_set_header而不用if:

location / {
  proxy_pass http://rubyapp.com;
  proxy_set_header Host $my_host;
}
Run Code Online (Sandbox Code Playgroud)

  • 我应该在什么范围内编写if语句?服务器或位置? (2认同)

Ber*_*set 19

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;
    }
}
Run Code Online (Sandbox Code Playgroud)