我最近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虚拟主机。