我有一个包含主站点和几个虚拟主机的域名。我希望所有站点(主站点和虚拟主机)只能通过 HTTPS(使用 HSTS)访问,并且我希望将不存在的子域重定向到主站点。
总结一下我想要的:
- https:/example.com:无重定向(主站点)
- http:/example.com:重定向到 https:/example.com
- https:/vhost.example.com:无重定向(虚拟主机)
- http:/vhost.example.com:重定向到 https:/vhost.example.com
- https:/doesntexist.example.com:重定向到 https:/example.com
- http:/doesntexist.example.com:重定向到 https:/example.com
我已经非常接近这个了,但倒数第二个重定向不起作用。我使用的是来自让我们加密,目前不提供通配符证书,因此该证书仅对主域和虚拟主机有效(我在创建证书时明确列出了这些虚拟主机)。由于证书无效,浏览器会阻止连接。
解决这个问题的最佳方法是什么(如果有的话)?
如果有帮助的话,这是我的(简化的)nginx 配置:
server {
listen 80;
server_name _;
return 301 https://example.com$request_uri;
}
server {
listen 443 spdy;
server_name _;
# SSL settings snipped for brevity. SPDY and HSTS are enabled.
return 301 https://example.com$request_uri;
}
server {
listen 443 spdy;
server_name example.com;
root /var/www/example.com;
index index.html index.htm;
}
server {
listen 443 spdy;
server_name vhost.example.com;
root /var/www/vhost.example.com;
index index.html index.htm;
}
答案1
实际上,没有通配符证书,您无法解决这个问题。如果您无法提供与请求的名称相匹配的证书,您将收到连接错误 - 这是协议的基本部分。
我想,理论上,你可以写一些东西,当它收到证书中没有的名称的 SNI 标头时,从 Let's Encrypt 快速颁发证书,并在 TLS 握手中发回新颁发的证书,但是……好吧,它不完全是实际的解决方案,是吗?