当执行proxy_pass到Tomcat时,Nginx如何将子域添加为参数

时间:2014-03-31 20:28:13

标签: java tomcat nginx dns wildcard-subdomain

我想要实现的目标
Web应用程序应该能够支持多个子域,而无需在每次使用新子域时对nginx或tomcat进行任何更改。 (我已经对DNS进行了必要的更改以支持通配符子域)

Nginx侦听端口80.它在端口8080处对tomcat执行proxy_pass。 nginx应该能够支持多个子域。

我目前的设置基于这个答案。但它没有传递参数
Nginx proxy_pass : Is it possible to add a static parameter to the URL?

每个可能的子域
dynamic_subdomain_1.localhost
dynamic_subdomain_2.localhost

nginx设置

server {
    listen 80 default_server;

    server_name ~^(?<subdomain>.+)\.localhost$;

    location / {
        set $args ?$args&site=$subdomain;
        proxy_pass http://127.0.0.1:8080;
    }
}

Nginx在调用Tomcat时应该将子域作为参数附加。

每个子域名对Tomcat的调用应如下所示

http://127.0.0.1:8080?site=dynamic_subdomain_1
http://127.0.0.1:8080?site=dynamic_subdomain_2

我已尝试过上述设置,但查询参数始终显示为null。

我应该在nginx中更改哪些内容才能实现这一目标?

1 个答案:

答案 0 :(得分:3)

答案比这简单一点。只需获取子域的子字符串,并将其用作proxy_pass的参数:

server {                                                         
  # this matches every subdomain of domain.
  server_name .domain;                                           

  location / {                                                   
    set $new_request_uri "";                                     
    set $subdomain "";

    if ($host ~* "^(.+)\.domain$") {                             
      set $subdomain $1;                                         
      # lets assume there are args...
      set $new_request_uri "$request_uri&subdomain=$subdomain";  
    }                                                            
    # if there are no args add a question mark and the subdomain argument
    if ($args = '') {                                            
      set $new_request_uri "$request_uri?subdomain=$subdomain";  
    }                                                            

    proxy_pass http://127.0.0.1:8080$new_request_uri;              
  }                                                              
} 

我考虑过有或没有args的请求。我认为它解决了你的问题。

阿尔弗雷