Letsencrypt Renewal + Nginx + owncloud config = 因为正则表达式失败

Letsencrypt Renewal + Nginx + owncloud config = failed because of regular expression

我正在 运行在 Debian 8 上使用 ngnix 创建自己的云服务器。 我从 letsencrypt 为该域使用 ssl 证书。

现在我想使用自动更新脚本,定期 运行 更新我的证书。这适用于所有域,除了 owncloud。

实际上在 nginx-owncloud-config 中有一个位置块,阻止 letsencrypt 进入子文件夹 domain.org/.well-known/acme-challenge:

location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
  deny all;
}

天哪,我不是正则表达式方面的专家,也不知道如何解决这个问题(以及这个表达式的实际含义)。

在那个块下面我包含了一个用于 letsecrypt-renewal 的位置块:

# Letsencrypt auto-renewal
location '/.well-known/acme-challenge' {
    default_type text/plain;
    root /var/www/;
    try_files $uri /;
}

我想我试过类似的东西:

location ~ ^/(?:\.(?!well-known/acme-challenge)|autotest|occ|issue|indie|db_|console) {
  deny all;
}

...不知道,这是否会影响表达式。

我唯一的办法就是注释掉"deny all"。它有效。实际上我的想法是,扩展续订脚本以停止服务器,更改 owncloud-conf,再次重新启动服务器,获取新证书,再次停止服务器,更改 owncloud-conf 并重新启动服务器...

但也许它更简单。我可能会学到更多关于正则表达式的知识...

有没有人给我提示?

location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) 拒绝访问任何以 /. 开头的 URI,例如 /.well-known.

首先,您的根目录中是否有任何以句点开头的文件和目录(/.well-known除外)?


一个选项是使正则表达式更具体,例如:

location ~ ^/(?:\.ht|autotest|occ|issue|indie|db_|console)

将拒绝访问任何以 /.ht.

开头的 URI

另一种选择是通过添加 ^~ 修饰符使 location '/.well-known/acme-challenge' 优先。参见 this document

location ^~ /.well-known/acme-challenge

这将使该位置优先于 所有 正则表达式位置。因此,如果该位置包含 .php 个文件,它们 可能 停止工作。


最后一个选择是将其转换为正则表达式位置:

location ~ ^/\.well-known/acme-challenge

在这种情况下,它具有相同的优先级,您可以将其排序在拒绝位置之上。