这里有一些技巧可以让RewriteCond 堆栈适用于多个RewriteRule,按递增WTF's per minute 排序。但这是配置而不是代码,所以这些规则不适用,对吧? :-)
1。环境变量
当您有许多 RewriteCond 时,将它们的结果存储在环境变量中,然后在每个规则中进行测试会更加紧凑。
# Your RewriteCond stack.
RewriteCond %{REQUEST_URI} !^IMAGE-.*$ [OR]
RewriteCond %{REQUEST_FILENAME} -f
# Store environment variable.
RewriteRule ^ - [E=TRUE:YEP]
# Assert environment variable in remaining RewriteRule's.
RewriteCond %{ENV:TRUE} =YEP
RewriteRule Rule1
RewriteCond %{ENV:TRUE} =YEP
RewriteRule Rule2
RewriteCond %{ENV:TRUE} =YEP
RewriteRule Rule3
2。跳过标志
这个有点微妙。使用[S] 或[skip] 标志,您可以跳过整个RewriteRule 块。
# Your RewriteCond stack.
RewriteCond %{REQUEST_URI} !^IMAGE-.*$ [OR]
RewriteCond %{REQUEST_FILENAME} -f
# If RewriteCond's match, skip the next RewriteRule.
RewriteRule ^ - [skip=1]
# Otherwise, this rule will match and the rest will be skipped.
RewriteRule ^ - [skip=3]
RewriteRule Rule1
RewriteRule Rule2
RewriteRule Rule3
这有点像 if 语句,RewriteCond 是条件,RewriteRule 是代码块。
您获得的重复更少,但代价是代码不太清晰,每次您从这组 N RewriteRule' 中添加或删除规则时都必须更新 [skip=N]秒。
好吧,如果你还在阅读,在这里你会发现另外两个解决方案,WTF's per minute 达到并超过临界点。它们仅供娱乐,您会明白为什么。
3。跳过没有 N 的标志
是的,有一种方法可以使用[skip] 标志而不包括N,即您要应用RewriteCond 堆栈的RewriteRule 的数量。也就是说...如果您在每个 RewriteRule 之前添加一对 RewriteCond,哦,是的,最后还有一个。
# Your RewriteCond stack.
RewriteCond %{REQUEST_URI} !^IMAGE-.*$ [OR]
RewriteCond %{REQUEST_FILENAME} -f
# If RewriteCond's match, skip the next RewriteRule.
RewriteRule ^ - [skip=1] # succeeded
RewriteRule ^ - [skip=2] # failed
RewriteRule Rule1
RewriteRule ^ - [skip=1] # succeeded
RewriteRule ^ - [skip=2] # failed
RewriteRule Rule2
RewriteRule ^ - [skip=1] # succeeded
RewriteRule ^ - [skip=2] # failed
RewriteRule Rule3
RewriteRule ^ - # no-op to cover for last [skip=2] rule
这里的诀窍是,当且仅当RewriteCond 成功时,每个[skip=1] 规则都会被处理,而当且仅当它们失败时,每个[skip=2] 规则才会被处理。
4。网址标记
使用部分 URL 来保持状态,然后在您的 RewriteRule 中匹配它。
# Your RewriteCond stack.
RewriteCond %{REQUEST_URI} !^IMAGE-.*$ [OR]
RewriteCond %{REQUEST_FILENAME} -f
# If RewriteCond's match, prepend bogus marker "M#" to internal URL.
RewriteRule .* M#$0
# All your RewriteRule's test for this marker plus whatever else.
RewriteRule ^M#.*Rule1
RewriteRule ^M#.*Rule2
RewriteRule ^M#.*Rule3
# Finally, don't forget to strip off the bogus marker.
RewriteRule ^M#(.*) $1
带有标记的新 URL 无效,但最后一个 RewriteRule 还原它,对吗?好吧,只有当它被处理时,所以不要让标记 URL 在它被还原之前逃脱这一轮 mod_rewrite 处理。然后你会得到一个 404。