htaccess正则表达式匹配路径包含'foo'而不包含'bar'

时间:2013-04-19 18:39:09

标签: regex .htaccess redirect

我试图通过.htaccess RedirectMatch 403文件阻止某些网址。

只有当YES不在网址中时,才应匹配包含NO的任何内容。是否匹配网址的一些示例:

  • / dir / YES / - >是的
  • / YES / file.ext - >是的
  • / dir / NO / dir / YES / file.ext - >没有
  • / NO / dir / dir / YES / file.ext - >无

dir/YES之间的/NO数也不详。

我尝试了各种 lookbehind 和模式,如:

  • (?<!themes/)(vendor)
  • (?<=[^themes])(/vendor)
  • (?<![themes/])(/|/[^themes]+/)vendor(/|$)

但是我正在努力让任何事情发挥作用,并想知道这是否真的是一个好主意。

2 个答案:

答案 0 :(得分:2)

将它与特定的RewriteCond一起使用,如下所示:

RewriteCond %{REQUEST_URI} !/NO/ [NC]
RewriteRule (^|/)YES(/.*|)$ - [F,L,NC]

答案 1 :(得分:1)

为什么你的模式不起作用:

(?<!themes/)(vendor)

如果themes/位于vendor的左侧,则只会丢弃匹配项。 Lookbehinds不会自动遍历整个字符串。

(?<=[^themes])(/vendor)

字符类不能像这样工作。 [^themes]匹配不属于ehmst的单个字符。

你想要的是(?<!themes.*/)(vendor),但只有.NET允许任意长度的后视镜。

诀窍是从头开始,确保在前往NO的前瞻途中没有YES

^(?!.*NO).*(YES)

^(?!.*themes).*(vendor)

因为前瞻可以是可变长度的。如果NO允许在 YES后出现,则必须检查前往YES的每个字符:

^((?!NO).)*(YES)
^((?!themes).)*(vendor)

编辑: anubhava的解决方案实际上更加整洁。如果您需要单一正则表达式解决方案,可以使用我的作为参考。