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

不久前,我发现了这种奇怪的行为,并且试图将其包裹住。

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

  • one.domain.com
  • two.domain.com
  • three.domain.com

  • 在我的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/

    10-17 02:31