所以我有一个服务器与一个单一的IP和许多网站,所有托pipe在Nginx下。 这是我的实际设置的一个非常简化的减less:
server { listen 80; listen 443 ssl; server_name ssl.example.com; #... } server { listen 80; server_name nossl.example.com; #... }
如果我连接到ssl.example.com:443一切正常,如预期的那样。
如果我连接到nossl.example.com:443 ,它会尝试提供ssl.example.com:443的内容。
为什么会发生这种情况呢 (这是ssl + nginx与虚拟服务器的最佳匹配),我只需要停止从错误的站点发送内容即可。
没有为我的所有网站购买证书(或自行发行),或将SSL网站推到自己的IP上,我的select是什么? nginx可以检查每个SSL请求的域名并确保它匹配server_name吗?
添加以下虚拟服务器:
server { listen 443 ssl; server_name _; ssl on; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/certificate.key; return 444; }
如果没有主机匹配,Nginx将使用这个作为最后的手段,并发回一个错误。
它需要一个SSL证书才能正常工作,但是您可以快速生成一个自签名证书,而且这样做也可以。 这比分享另一个有效的,另一个域的现有证书(无论如何抛出错误)要好,因为泄漏较less。
我倾向于认为#2是最合适的答案,但是我发现当放置在非ssl虚拟服务器的服务器块上方时,以下情况也适用。
server { listen 443; server_name .example.com; return 444; }
不要使用“ssl”标志。