使用 HTTPS 将所有子域名重定向到主域名,无需通配符证书(nginx)

使用 HTTPS 将所有子域名重定向到主域名,无需通配符证书(nginx)

我有一个包含主站点和几个虚拟主机的域名。我希望所有站点(主站点和虚拟主机)只能通过 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 握手中发回新颁发的证书,但是……好吧,它不完全是实际的解决方案,是吗?

相关内容