Nginx 不监听子域名的 HTTPS 请求

Nginx 不监听子域名的 HTTPS 请求

我有一台 Nginx 服务器,它同时托管网站的主域foo.com和子域。我只有主域的证书,因此我只想对子域进行 HTTP 请求。我已经配置了两个服务器块,所有请求都运行正常:将被重定向到,并且只停留在 HTTP 上。bar.foo.comhttp://foo.comhttps://foo.comhttp://bar.foo.com

然而,当我尝试连接时出现了一个问题https://bar.foo.com,虽然我没有配置子域服务器块来监听 443 或 ssl 请求,但请求仍然被处理,并且在从浏览器收到警告后,指出证书的主机名与我请求的主机名不同,我得到的页面来自主域foo.com

因此,显然,原本server应该只监听我主域的 HTTPS 请求的块,不知何故也在监听子域的 HTTPS 请求,我不希望发生这种情况。

这是我的主域配置:

server {
  listen       80;
  server_name  foo.com www.foo.com;

  return 301 https://$server_name$request_uri;
}

server {
  listen       443 ssl;
  server_name  foo.com www.foo.com;

  ssl                  on;
  ssl_certificate      /etc/nginx/cert/foo.com.pem;
  ssl_certificate_key  /etc/nginx/cert/foo.com.key;
  ...

  location / {
    root   /var/www/foo.com/public_html;
    index  index.html index.htm;
  }
}

这是我的子域名配置:

server {
  listen       80;
  server_name  bar.foo.com www.bar.foo.com;

  location / {
    root   /var/www/bar.foo.com/public_html;
    index  index.html index.htm;
  }
}

以下是 Nginx 配置文件的片段:

server {
  listen       80 default_server;
  listen       [::]:80 default_server;
  server_name  _;
  root         /usr/share/nginx/html;

  location / {
}

我尝试删除foo.comlisten域的 443 服务器块,但没有帮助。

我希望 Nginx 不监听诸如此类的请求,https://bar.foo.com或者只是返回 404 或 444。

答案1

由于您只server为端口 443 配置了一个块,因此它是 nginx 用于服务对端口 443 的所有请求的默认虚拟服务器。

要添加端口 443 (TLS) 的默认服务器,您可以添加以下虚拟主机:

server {
    listen 443 default_server;
    server_name _;
    return 444;
}

答案2

我已经找到解决方案了。正如@Tero 和@Cosmic 正确指出的那样,我server主域的唯一 443 块被设置为server所有 443 请求的默认块。

我注释掉了serverNginx配置文件中的该块/etc/nginx/nginx.conf,并添加了以下两个server块:

server {
  listen      80 default_server;
  server_name  _;
  return 444;
}

server {
  listen       443 ssl default_server;
  server_name  _;
  ssl_certificate      /etc/nginx/cert/foo.bar.pem;
  ssl_certificate_key  /etc/nginx/cert/foo.bar.key;
  return 444;
}

第一个将被设置server为任何 HTTP 请求的默认阻止,删除任何不匹配的请求,同样第二个将删除任何不匹配的 443 或 HTTPS 请求。

@Tero 提供的解决方案不起作用,因为 Nginx 需要任何 SSLserver块的证书,因此您需要为其提供证书。

相关内容