【问题标题】:Regex: match '/.' only if not prefixed with '/_local/.'正则表达式:匹配 '/.'仅当不以 '/_local/.' 为前缀时
【发布时间】:2016-09-29 20:31:25
【问题描述】:

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

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

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

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

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

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

例如

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

RegEx 专家可以帮忙吗?

【问题讨论】:

    标签: regex nginx couchdb


    【解决方案1】:

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

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

    这使用了“否定的后视断言”:(?&lt;!\/_local) 表示“不以/_local 为前缀”。

    编辑:转义正斜杠

    【讨论】:

    • 你的工作太棒了!我必须稍作修改才能避开正斜杠以使其正常工作。使用有效的解决方案更新了您的答案。再次感谢!
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多