34

我正在运行 nginx 作为站点 example.com 的反向代理,以对后端服务器中运行的 ruby​​ 应用程序进行负载平衡。我在 nginx 中有以下proxy_set_header字段,它将主机头传递给后端 ruby​​。这是 ruby​​ 应用程序识别子域名所必需的。

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

现在我想创建一个 alias 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;
}

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

4

4 回答 4

37

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

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

现在您可以只使用proxy_passproxy_set_header而不使用 if 块:

location / {
  proxy_pass http://rubyapp.com;
  proxy_set_header Host $my_host;
}
于 2013-01-16T07:03:31.973 回答
30

地图优于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;
    }
}
于 2016-04-04T16:01:57.460 回答
3

我试图解决同样的情况,但使用uwsgi_pass.

经过一些研究,我发现在这种情况下,需要:

uwsgi_param HTTP_HOST $my_host;

希望它可以帮助别人。

于 2019-01-30T16:42:24.270 回答
2

只是一个小提示。有时您可能需要使用X-Forwarded-Host而不是Host标头。这就是我的主机标头工作但仅适用于标准 HTTP 端口 80 的情况。如果应用程序暴露在非标准端口上,那么当应用程序生成重定向时该端口会丢失。所以最后对我有用的是:

proxy_set_header X-Forwarded-Host $http_host;
于 2018-06-28T10:24:28.813 回答