如果是Nginx单域名的Https访问,想必大家都很熟悉了,只需要把这个单域名的SSL证书通过ssl_certificate、ssl_certificate_key两个关键字分别导入证书和私钥即可。例如:
ssl_certificate /www/wwwroot/name1.cn/fullchain.pem;
ssl_certificate_key /www/wwwroot/name1.cn/privkey.pem;但是多域名要怎么办呢,测试过直接一股脑的导入证书是不行的,总会选用第一个证书,Nginx并不会智能切换:
# 错误配置,总是使用 name1.cn 路径下的证书
ssl_certificate /www/wwwroot/name1.cn/fullchain.pem;
ssl_certificate_key /www/wwwroot/name1.cn/privkey.pem;
ssl_certificate /www/wwwroot/name2.cn/fullchain.pem;
ssl_certificate_key /www/wwwroot/name2.cn/privkey.pem;既然Nginx不会智能切换,那就多添加一步手动切换。具体思路是在证书路径中用一个变量替换域名所在位置,让这个变量能跟随不同域名切换,这样Nginx调用的证书也就跟着切换了。这个变量可以参考$ssl_server_name,这个值是每次Https请求的Host部分。例如访问“https://www.baidu.com/search”,这个值就是“www.baidu.com”。更改之后:
ssl_certificate /www/wwwroot/$ssl_server_name/fullchain.pem;
ssl_certificate_key /www/wwwroot/$ssl_server_name/privkey.pem;还有一个情况,例如想要将tsdm39.com、www.tsdm39.com、bbs.tsdm39.com都指向同一个服务,新建三个文件夹都放上证书显然不太“优雅”,到时候证书到期更换证书还麻烦。一般来说申请证书都会选择主域+通配符子域的形式吧,那么这三个地址完全可以用同一个证书,文件夹使用tsdm39.com命名,每次从$ssl_server_name提取出主域名即可。
要说提取出主域名,我这有个原创的正则表达式可厉害了,我练习了两年半正则表达式才想出来的,针对上面三种情况都能正确地提取出主域名tsdm39.com,并且支持含有符号“-”的域名和中文域名,泛用性杠杠的:
(?:.+?\.)?(.+\..+)使用这个正则表达式的终极完全体Nginx配置:
map $ssl_server_name $host_cert_name {
"~(?:.+?\.)?(.+\..+)" $1; # 提取出主域
default "default"; # 默认值
}
server {
... # listen 443 等配置,这里省略
ssl_certificate /www/wwwroot/$host_cert_name/fullchain.pem;
ssl_certificate_key /www/wwwroot/$host_cert_name/privkey.pem;
}各位如果觉得有用请点击下方的打赏,扫描二维码给我投币,创作不易,感谢支持!
我要评论!!!