【问题标题】:How to force exact match of subdomains with NGINX?如何强制子域与 NGINX 完全匹配?
【发布时间】:2019-06-11 17:13:17
【问题描述】:

我使用 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 部分中列出的子域。

【问题讨论】:

    标签: docker nginx dns


    【解决方案1】:

    Nginx 测试请求的标头字段“Host”(或在 https 的情况下为 SNI 主机名)以确定应将请求路由到哪个服务器。如果它的值不匹配任何服务器名称,或者请求根本不包含这个头域,那么 nginx 会将请求路由到这个端口的默认服务器。在上面的配置中,默认服务器是第一个(也是唯一一个)服务器——这是 nginx 的标准默认行为。如果有多个server 块,也可以通过listen 指令中的default_server 参数显式设置默认哪个服务器

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

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

    【讨论】:

    • 感谢您的回答杜桑!所以基本上只需要一个默认服务器来处理没有匹配服务器名称的请求。
    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2020-06-01
    • 2013-02-09
    • 1970-01-01
    相关资源
    最近更新 更多