正则表达式:匹配 '/.'仅当不以“/_local/”为前缀时。

Regex: match '/.' only if not prefixed with '/_local/.'

我讨厌正则表达式!我的大脑只是不像正则表达式那样工作。有人可以帮助我解决以下问题吗?

我有一个 nginx 配置文件当前阻止所有出于安全原因访问系统或隐藏文件的尝试(即以“.”开头的文件),具有以下 位置配置 :

location ~ \/\. {
  access_log off;
  log_not_found off;
  deny all;
}

但是,这也阻止了我的 CouchDB 服务器对 example.com/db/_local/.XYZ

的请求

我想允许对 X/_local/.X 的所有请求,但拒绝对 X/.X 的所有其他请求。

所以我的正则表达式必须匹配所有 /. 但不匹配 /_local/..

例如

example.com/.secretfile          // deny
example.com/db/_local/.LONGHASH  // allow
example.com/other/.other         // deny

任何正则表达式专家都可以帮忙吗?

假设Ngninx完全兼容PCRE,这应该是一个解决方案:

location ~ (?<!\/_local)\/\. {

这使用了“负向后断言”:(?<!\/_local) 表示“没有前缀 /_local”。

编辑: 转义正斜杠