我正在使用Nginx作为反向代理。它在Swarm集群中作为容器化服务运行。
不久前,我发现了这种奇怪的行为,并且试图将其包裹住。
在主机上,我设置了三个子域:
在我的Nginx服务器配置中,我指定的目标服务器名称是three.domain.com,因此我希望Nginx仅响应针对该子域的请求。
events { worker_connections 1024; }
http {
upstream service {
server node:3000;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name three.domain.com;
[...... ssl settings here.......]
location / {
proxy_pass http://service;
proxy_set_header Host $host;
}
}
}
发生的情况不仅是响应发送到three.domain.com的请求,还响应one.domain.com和two.domain.com。 (它将它们路由到three.domain.com)
如果我添加了多个专门针对子域1和2的服务器块,它会按预期工作,它将请求路由到它们所属的位置。
就是说,理想的行为是仅响应服务器块的server_name部分中列出的子域。
最佳答案
Nginx测试请求的 header 字段“主机”(如果使用https,则为SNI主机名),以确定请求应路由到哪个服务器。如果其值与任何服务器名称都不匹配,或者请求根本不包含此 header 字段,则nginx会将请求路由到该端口的默认服务器。在上述配置中,默认服务器是第一个(也是唯一一个),这是nginx的标准默认行为。如果存在多个server
块,则还可以使用listen指令中的default_server
参数来明确设置默认服务器。
因此,您需要添加另一个server
块:
server {
listen 443 ssl default_server;
server_name default.example.net;
...
return 444;
}
关于docker - 如何使用NGINX强制子域完全匹配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56538783/