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

时间:2013-01-16 06:42:56

标签: nginx

我正在运行nginx作为站点example.com的反向代理,以对在后端服务器中运行的ruby应用程序进行负载均衡。我在nginx中有以下proxy_set_header字段,它将主机头传递给后端ruby。这是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;
}

这样做的最佳方式是什么?

4 个答案:

答案 0 :(得分:24)

你不能在if块中使用 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;
}

答案 1 :(得分:18)

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;
    }
}

答案 2 :(得分:2)

我尝试使用uwsgi_pass解决相同的情况。

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

uwsgi_param HTTP_HOST $my_host;

希望它对其他人有帮助。

答案 3 :(得分:0)

只是一个小技巧。有时您可能需要使用 X-Forwarded-Host 而不是 Host 标头。在我的案例中,Host标头有效,但仅适用于标准HTTP端口80。如果应用程序在非标准端口上公开,则当应用程序生成重定向时,此端口将丢失。所以最后对我有用的是:

proxy_set_header X-Forwarded-Host $http_host;