我刚刚注意到,如果没有www
所以我们有四种不同的情况:
http://example.com
<-有效
https://example.com
<- 不起作用
http://www.example.com
有效
https://www.example.com
有效
情况是,对于每个请求,无论您选择上述哪种路线,都应始终以https://www.example.com
我不是第一个遇到此问题的人,我尝试了许多情况,但没有任何运气(例如,这些解决方案:here)
当我尝试访问https://example.com
时,我得到一个SSL_ERROR_BAD_CERT_DOMAIN
。因此,该证书仅对www.example.com
有效,这是有道理的。但我还有另一份适用于example.com
的证书。
知道,我的NGINX设置如下:
server {
listen 443 ssl;
server_name example.com
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 default_server ssl;
server_name www.example.com;
root /home/build/;
index index.html index.htm;
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
location / {
try_files $uri /index.html;
}
}
server {
listen 80;
server_name www.example.com example.com;
return 301 https://www.example.com$request_uri;
}
我使用NGINX已有一段时间了,实际上直到最近我才意识到我遇到了这个问题。
我知道我可以在有www
和没有www.example.com
的情况下提供页面,这将解决问题。但我希望每次互动都应在www
上进行,而不要没有git remote -v
。
我正在Ubuntu 18.04上运行NGINX版本1.14.0。
所有帮助均已申请。
答案 0 :(得分:0)
如果有人有兴趣,我就解决了这个问题。
我没有通配证书,而是获得了通配符证书,并向其中添加了根域。
因为在本例中使用的LetsEncrypt还提供了免费的通配符证书,所以我的所有子域和根域都可以使用相同的证书。
安装通配符证书后,我的NGINX文件如下所示:
server {
listen 443 default_server ssl;
server_name www.example.com;
root /home/build/;
index index.html index.htm;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
try_files $uri /index.html;
}
}
server {
server_name www.example.com example.com;
return 301 https://www.example.com$request_uri;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
if ($host = example.com) {
return 301 https://$host$request_uri;
}
if ($host ~ ^[^.]+\.example\.com$) {
return 301 https://$host$request_uri;
}
listen 80;
server_name www.example.com example.com;
return 404;
}
应该说,代码的最后部分非常受certbot
的设置启发。