0

我正在尝试通过.htaccess带有RedirectMatch 403.

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

  • /dir/ YES/ -> 是的
  • //file.ext YES-> 是
  • /dir/ NO/dir/ YES/file.ext -> 否
  • / NO/目录/目录/YES /file.ext -> 没有

还有一个未知数量的dir介于/YES和之间/NO

我尝试了各种后视和模式,例如:

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

但是我正在努力让任何工作正常进行,并想知道这是否真的是一个好主意。

4

2 回答 2

2

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

RewriteCond %{REQUEST_URI} !/NO/ [NC]
RewriteRule (^|/)YES(/.*|)$ - [F,L,NC]
于 2013-04-19T18:50:41.153 回答
1

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

(?<!themes/)(vendor)

themes/仅当紧靠 左侧时才会丢弃匹配项vendor。Lookbehinds 不会自动遍历整个字符串。

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

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

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

诀窍是从头开始,并确保没有使用前瞻NO的方式:YES

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

或者

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

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

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

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

于 2013-04-19T18:52:45.167 回答