【问题标题】:Rewrite a subdomain to a backend proxy whith nginx使用 nginx 将子域重写为后端代理
【发布时间】:2016-08-19 05:29:32
【问题描述】:

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

我有一个在端口 5000 上侦听的后端服务器:http://127.0.0.1:5000

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

喜欢:https://sub.mydomain.com/list 到 http://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

【问题讨论】:

    标签: nginx url-rewriting


    【解决方案1】:

    要传递所有子域,您需要在服务器名称中设置它,方法是在域之前放置点。

    server_name .mydomain.com;

    【讨论】:

      【解决方案2】:

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

      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/)
         }
      }
      

      就是这样:)

      【讨论】:

        【解决方案3】:

        如果我使用 $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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-12
          • 2012-05-19
          • 1970-01-01
          • 2012-03-05
          • 1970-01-01
          • 1970-01-01
          • 2011-01-30
          相关资源
          最近更新 更多