我正在运行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;
}
这样做的最佳方式是什么?
答案 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;