一尘不染

执行对Tomcat的proxy_pass时,Nginx如何添加子域作为参数

tomcat

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

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

我当前的设置基于此答案。 但是它没有传递参数

Nginxproxy_pass:是否可以在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中进行哪些更改以使其成为可能?


阅读 215

收藏
2020-06-16

共1个答案

一尘不染

答案比这简单。只需获取具有子域的子字符串,并将其用作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;              
  }                                                              
}

我考虑了带或不带参数的请求。我认为这可以解决您的问题。

2020-06-16