nginx 忽略除一个域之外的所有域的 https

nginx 忽略除一个域之外的所有域的 https

我最近设置了一个 VPS,上面运行着几个网站(都使用不同的域),使用 nginx 将请求代理到正确的应用程序。

我有有效的 SSL 证书这些域名,所以我为此设置了一个 http->https 直接:

server {
  listen         80;
  server_name    example.com www.example.com;
  return         301 https://$server_name$request_uri;
}

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

  ssl_certificate ..... (etc)
}

对于其他域,我仅在端口 80 上监听,显然不设置 SSL 证书。尽管所有域都可以访问,并且 HTTPS 重定向对于主域按预期工作,但我注意到,当我通过 HTTPS 加载其他域之一(没有 SSL 证书)时,nginx 正在提供错误的网站,而不是......根本不接受连接,我期望?

我尝试在加载可用站点之前添加默认配置:

server {
  listen 80;
  listen 443 ssl;
  return 444;
}

除了我的主域不再通过 HTTPS 可用(尽管 HTTP->HTTPS 重定向仍然有效)之外,这给了我预期的行为。

这可能是愚蠢的行为,也可能是我没有正确理解 nginx 处理配置的方式,但我不知道问题究竟出在哪里。帮忙?

答案1

这是预期的行为。

您在单个 IP 地址上使用 vhost,同时监听 HTTP 和 HTTPs。因此,处理 SSL 的服务器块将充当所有进入此 IP 端口 443 的服务器块的默认服务器块。

您将无法拒绝 SSL 握手,但在完成后,您可以通过添加返回 nginx 特殊 444 代码的单独的 catch-all 服务器块来禁止不针对特定域的进一步 HTTP 请求。

通用解决方案是为域设置一个唯一的 IP,该 IP 应同时支持 HTTP 和 HTTPS,并处理其他 IP 上的所有其他 HTTP vhost。

相关内容