我在同一个 IP 中有两个站点,配置如下:
- site1.com
- 多个子域(即:foo.site1.com、bar.site1.com)
- 一切都在端口 80 上侦听,443 中没有任何东西
- site2WithSSL.com
- 监听端口 80 和 443 (SSL)
我可以毫无问题地访问https://site2WithSSL.com和http://site1.com 。当有人想访问https://site1.com时,问题就出现了,nginx 用 site2WithSSL.com 回答我想避免这种情况。我的意思是,每当有人访问https://site1.com时,都不需要返回任何内容,或者只需重定向到https ://
配置是:
server {
listen 80;
server_name *.site1.com;
// ...
}
server {
server_name www.site2WithSSL.com;
return 301 $scheme://site2WithSSL.com$request_uri;
}
server {
listen 80;
listen 443 ssl;
server_name site2WithSSL.com;
ssl_certificate site2WithSSL.crt;
ssl_certificate_key site2WithSSL.key;
// ...
}
已解决:为每个站点使用不同的 ip
您的问题是 SSL 不支持同一 IP 上的多个虚拟主机。
当 NGINX 通过 HTTP/1.1 接收到新连接时,请求包含一个 HOST 标头,指定要服务的虚拟主机(这是 1.1 中的重大变化,并允许我们今天所知道的虚拟主机)。
但是使用 HTTPS,标头是加密的,并且必须建立密钥交换和 TLS 层才能解密。换句话说,在发送 SSL 证书之前,nginx 无法选择正确的 SSL 服务器块。
您可以在 site2 的配置下添加匹配 site1 的域名的重定向,但用户仍然会收到一条消息说证书无效,所以这不是很可口。
您可以使用一些多域证书,但需要付费。
最简单的,并且对于您想要的配置,可能是最好的选择,是为每个站点使用不同的 IP 地址。不同的 NGINX 服务器配置可以绑定到不同的地址,因此永远不会有关于哪个是哪个的问题。大多数提供商可以为您提供多个 IP 地址,有些甚至多个块,当然在云中您可以提供更多。
更新:SNI 通过将 Host 标头移到加密有效负载之外来解决此问题,并且受现代浏览器支持。
不可能只为一个站点侦听同一 IP 上的端口 443,因为它只知道客户端想要从 SSL 客户端 Hello 获得哪个站点。收到 Hello 后,它可以选择完成 SSL 握手或切断连接。在第一种情况下,您需要提供证书,在后一种情况下,客户端将收到一些关于 SSL 连接断开的无用错误。
最后归结为以下选项:
只有最后一个选项在客户端不会出现任何错误。
我正在考虑在没有 ssl 的情况下监听端口 443 的 site1.com 的配置,它只重定向到http://site1.com。我认为它应该可以在不需要新的 IP 地址的情况下工作。