我试图通过.htaccess
RedirectMatch 403
文件阻止某些网址。
只有当YES
不在网址中时,才应匹配包含NO
的任何内容。是否匹配网址的一些示例:
YES
/ - >是的YES
/ file.ext - >是的NO
/ dir / YES
/ file.ext - >没有NO
/ dir / dir / YES
/ file.ext - >无 dir
和/YES
之间的/NO
数也不详。
我尝试了各种 lookbehind 和模式,如:
(?<!themes/)(vendor)
(?<=[^themes])(/vendor)
(?<![themes/])(/|/[^themes]+/)vendor(/|$)
但是我正在努力让任何事情发挥作用,并想知道这是否真的是一个好主意。
答案 0 :(得分:2)
将它与特定的RewriteCond一起使用,如下所示:
RewriteCond %{REQUEST_URI} !/NO/ [NC]
RewriteRule (^|/)YES(/.*|)$ - [F,L,NC]
答案 1 :(得分:1)
为什么你的模式不起作用:
(?<!themes/)(vendor)
如果themes/
位于vendor
的左侧,则只会丢弃匹配项。 Lookbehinds不会自动遍历整个字符串。
(?<=[^themes])(/vendor)
字符类不能像这样工作。 [^themes]
匹配不属于e
,h
,m
,s
或t
的单个字符。
你想要的是(?<!themes.*/)(vendor)
,但只有.NET允许任意长度的后视镜。
诀窍是从头开始,确保在前往NO
的前瞻途中没有YES
:
^(?!.*NO).*(YES)
或
^(?!.*themes).*(vendor)
因为前瞻可以是可变长度的。如果NO
允许在 YES
后出现,则必须检查前往YES
的每个字符:
^((?!NO).)*(YES)
^((?!themes).)*(vendor)
编辑: anubhava的解决方案实际上更加整洁。如果您需要单一正则表达式解决方案,可以使用我的作为参考。