正则表达式:匹配' /.&# 39;只有在没有前缀为' / _ local /.&#39的情况下;

时间:2016-09-28 01:23:35

标签: regex nginx couchdb

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

我有一个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

任何RegEx大师都可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

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

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

这使用“负面后瞻断言”:(?<!\/_local)表示“不以/_local为前缀”。

编辑: Escaped正斜杠