除了一个域名,nginx忽略https

我最近build立了一个VPS,运行了几个网站(全部使用不同的域),使用nginx将请求代理到正确的应用程序。

我有一个有效的SSL证书为这些域之一,所以我build立了一个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证书。 虽然所有域都可以访问,并且HTTPSredirect按照主域所预期的那样工作,但是我注意到,当我通过HTTPS加载其他域之一(没有SSL证书)时,nginx正在服务错误的网站,而不是…接受连接,我会期待?

我试图在加载站点之前添加一个默认configuration – 可用:

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

除了我的主域不再可以通过HTTPS(尽pipeHTTP-> HTTPSredirect仍然有效)这个事实之外,它给了我预期的行为。

这可能是愚蠢的和/或我没有正确理解nginx处理configuration的方式,但我不知道问题的确切位置。 帮帮我?

这是预期的行为。

您正在一个IP地址上使用虚拟主机,您可以在这两个IP地址上侦听HTTP和HTTP。 所以处理SSL的服务器模块是所有到达这个IP端口443的默认服务器。

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

通用的解决scheme是为域名提供一个唯一的IP,该域名应支持HTTP和HTTPS,并处理其他IP上的所有其他HTTP虚拟主机。