如何使用NGINX强制子域完全匹配?

时间:2019-06-11 07:41:32

标签: docker nginx dns

我正在使用Nginx作为反向代理。它作为Swarm集群中的容器化服务运行。

前一段时间,我发现了这种奇怪的行为,并且试图将其包裹住。

在主机上,我设置了三个子域:

  • one.domain.com

  • two.domain.com

  • three.domain.com

在我的Nginx服务器配置中,我指定的目标server_name是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部分中列出的子域。

1 个答案:

答案 0 :(得分:0)

Nginx测试请求的标头字段“主机”(如果使用https,则为SNI主机名),以确定应将请求路由到哪个服务器。如果其值与任何服务器名称都不匹配,或者请求根本不包含此标头字段,则nginx会将请求路由到该端口的默认服务器。在上述配置中,默认服务器是第一个(也是唯一一个),这是nginx的标准默认行为。如果有多个server块,还可以使用listen指令中的default_server参数明确设置默认服务器。

因此,您需要添加另一个server块:

server {
    listen      443 ssl default_server;
    server_name default.example.net;
    ...
    return      444;
}