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
我非常接近這一點,但倒數第二個重定向不起作用。我正在使用Let’s Encrypt的證書,該證書目前不提供萬用字元證書,因此該證書僅對主域和虛擬主機有效(我在創建證書時已明確列出)。由於證書無效,瀏覽器會阻止連接。
規避此問題的最佳方法(如果有)是什麼?
如果有幫助,這是我的(簡化的)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; }
實際上,如果沒有萬用字元證書,您將無法解決該問題。如果您不能提供與所請求的名稱匹配的證書,您將收到連接錯誤——這是協議的基本部分。
我想,理論上,你可以寫一些東西,當它收到一個不在證書中的名稱的 SNI 標頭時,從 Let’s Encrypt 快速頒發證書,並在 TLS 握手中發回新生成的證書,但是。 ..好吧,這不是一個實際的解決方案,是嗎?