我想要实现的目标
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中更改哪些内容才能实现这一目标?
答案 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的请求。我认为它解决了你的问题。
阿尔弗雷