1

我正在编写一个将服务于数百个域的 nginx 配置。为了启用 SSL,我为所有这些都颁发了 letsinctrypt 证书,并使用了这个配置:

http {
  map $ssl_server_name $cert_folder {
    default   $ssl_server_name;
  }
  server {
    listen          <ip>:443 ssl http2 default_server;
    server_name     _;
    ssl_certificate          /etc/letsencrypt/live/$cert_folder/fullchain.pem;
    ssl_certificate_key      /etc/letsencrypt/live/$cert_folder/privkey.pem;
        
    [...]
  }
}

但是当有人使用“www.example.com”之类的地址时,它不会找到证书文件,因为没有这样的文件夹。

两个版本都颁发了证书,所以我只想删除“www”。来自 $cert_folder 变量(如果存在)。

有什么办法可以做到这一点?

4

1 回答 1

1

您可以使用 map 最好地实现此目的,但您需要使用 Perl 正则表达式过滤域,如下所示:

map $ssl_server_name $cert_folder {
      default $ssl_server_name;
      ~*www.(.*) $1;
 }

您的变量$cert_folder现在将是 www 的值。(域名)

它将是 example.com 代替www.example.com

我已经对此进行了测试,并且可以正常工作。

于 2021-07-25T13:05:02.243 回答