将子域重写为后端代理与nginx

时间:2016-04-25 17:21:29

标签: nginx url-rewriting

如果我的nginx网络服务器配置上有子域名:sub.mydomain.com

我有一个后端服务器,可以监听端口5000:http://127.0.0.1:5000

是否可以将所有子域调用传递给后端?

赞:https://sub.mydomain.com/listhttp://127.0.0.1:5000/sub/list

这适用于所有方法:POST,PUT,GET,DELETE

更新

当我呼叫我的服务器时:https://mysubdomain.mydomain.com

使用以下配置:

upstream http_backend {
    server 127.0.0.1:5000;
}

server_name ~^(?<subdomain>[^.]+)\.mydomain\.com;

这不起作用(错误:404):

location / {
    proxy_pass http://http_backend/$subdomain/;

    proxy_redirect off;
    proxy_set_header    Host            $host;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto https;
}

这很好用:

location / {
    proxy_pass  http://http_backend/mysubdomain/;

    proxy_redirect off;
    proxy_set_header    Host            $host;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto https;
}

当我在access_log中记录$ subdomain变量时,它似乎是正确的。 nginx版本:nginx / 1.9.15

3 个答案:

答案 0 :(得分:0)

要通过所有子域,您需要通过在域前放置点来将其设置为服务器名称。

server_name .mydomain.com;

答案 1 :(得分:0)

是的,您可以在proxy_pass中使用变量。您可以使用regexp服务器名称提取部分域。

server {
   server_name ~^(?<sub>[^.]+)\.example\.com;
   # now subdomain of example.com placed to $sub
   # please, note, this rule do not work for http://example.com
   location / {
      proxy_pass http://127.0.0.1:5000/$sub/;
      # Path part of proxy_par URI will replace path 
      # part of location directive (so / -> /$sub/, /xxxx/ -> /$sub/xxxx/)
   }
}

多数民众赞成:)

答案 2 :(得分:0)

如果我使用$ subdomain变量,似乎nginx不会将$ uri添加到proxy_pass。

以下解决方案有效:

location / {
    proxy_pass http://http_backend/$subdomain/$uri;
    proxy_redirect off;
    proxy_set_header    Host            $host;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto https;
}