![基于 $host 的 Nginx ssl_certificate?](https://linux22.com/image/753487/%E5%9F%BA%E4%BA%8E%20%24host%20%E7%9A%84%20Nginx%20ssl_certificate%EF%BC%9F.png)
您好,我该如何做ssl_certificate
才能做到:ssl_certificate_key
$host
if $host = domain.com than set one path, if $host = example.com than set another path
?
我在用nginx/1.15.8
如果我为域创建不同的块,则重新加载时会收到错误:
nginx: [emerg] duplicate zone "cache"
因此我需要 1 个块并根据域加载证书。
答案1
您可以使用map
指令替换:
map $host $certfile {
domain.com /path/to/certificate_1;
example.com /path/to/certificate_2;
}
map $host $keyfile {
domain.com /path/to/key_1;
example.com /path/to/key_2;
}
server {
...
ssl_certificate $certfile;
ssl_certificate_key $keyfile;
...
}
更新 1
正如@AlexeyTen 所说,此配置需要 nginx >= 1.15.9,因此它不适用于 nginx 1.15.8(或最新的 openresty 生产版本 1.15.8.3)。如果您使用 openresty,则使用此配置的唯一方法是手动构建和安装 1.17.8.1 RC1。
更新 2
另外,您可以申请一个对两个域名都有效的新证书。我自己也这样做了这bash 脚本使用以下命令:
acme.sh --issue -d domain.com -d example.com --webroot /my/web/root
答案2
总体而言,投票的解决方案是不正确的:除非发生 tls 终止,否则不会填充 $host 变量。
正确的解决方案如下所述:https://jjj.blog/2019/05/variable-ssl-certificate-directives-in-nginx-part-2/