我最近设置了一个 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。