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

更改nginx反向代理中的主机头,nginx,Nginx,我正在运行nginx作为example.com站点的反向代理,以负载平衡在后端服务器上运行的ruby应用程序。我在nginx中有以下proxy\u set\u header字段,它将主机头传递给后端ruby。这是ruby应用程序识别子域名所必需的 location / { proxy_pass http://rubyapp.com; proxy_set_header Host $http_host; } 现在我想创建一个别名beta.example.com,但是传递到后端的主机

我正在运行nginx作为example.com站点的反向代理,以负载平衡在后端服务器上运行的ruby应用程序。我在nginx中有以下
proxy\u set\u 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;
}
执行此操作的最佳方法是什么?

您不能使用代理\u传入if块,因此我建议在设置代理标头之前执行类似操作:

set $my_host $http_host;
if ($http_host = "beta.example.com") {
  set $my_host "www.example.com";
}
现在,您只需使用proxy_pass和proxy_set_头,而无需if块:

location / {
  proxy_pass http://rubyapp.com;
  proxy_set_header Host $my_host;
}
优于
设置
+
如果

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

只是一小笔小费。有时您可能需要使用X-Forwarded-Host而不是Host头。这就是我的情况,主机头工作,但仅适用于标准HTTP端口80。如果应用程序在非标准端口上公开,则当应用程序生成重定向时,此端口将丢失。因此,最终对我起作用的是:

proxy_set_header X-Forwarded-Host $http_host;

我试图解决同样的问题,但是使用了
uwsgi\u pass

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

uwsgi_param HTTP_HOST $my_host;

希望它能帮助其他人。

这更适合于。我应该在什么范围内编写if语句?服务器还是位置?在nginx文档中,提到set和if如果不在位置中,而是在服务器中就可以了。然而,map也是一个不错的选择。你能找到你提到的文档吗?我从没读过。此外,涉及
if
的nginx罚单通常会指出与其使用相关的问题。例如:。如果仍然有效,建议避免设置&
。这正是我想要的,非常感谢!