首页 文章

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

提问于
浏览
18

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

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

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

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

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

3 回答

  • 22

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

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

    现在你只需使用 proxy_passproxy_set_header ,如果阻止:

    location / {
      proxy_pass http://rubyapp.com;
      proxy_set_header Host $my_host;
    }
    
  • 0

    map优于设置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;
        }
    }
    
  • 16

    只是一个小小的提示 . 有时您可能需要使用 X-Forwarded-Host 而不是 Host 标头 . 这是我的情况,其中Host头工作但仅适用于标准HTTP端口80.如果应用程序在非标准端口上公开,则当应用程序生成重定向时此端口丢失 . 最后对我有用的是:

    proxy_set_header X-Forwarded-Host $http_host;
    

相关问题