多重写条件:如何在一组规则之前将它们链接起来?

时间:2011-03-14 23:48:28

标签: apache url mod-rewrite apache2

Q1 :如何将这两个条件联系起来 if BOTH A AND B, then proceed...
Q2 :如何让它们坚持下面的所有重写规则,而不仅仅是第一条规则?

RewriteCond %{REQUEST_URI} ^IMAGE-.*$      // if filename starts with IMG- and,
RewriteCond %{REQUEST_FILENAME} !-f        // if file does exist, then proceed:
RewriteRule Rule1
RewriteRule Rule2
RewriteRule Rule3

# -- END IF -- STOP HERE -- #

3 个答案:

答案 0 :(得分:34)

以下是使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 {{ 1}}' S

<乐趣>

好吧,如果你还在阅读,在这里你会找到另外两个WTF's per minute达到并超过临界点的解决方案。他们只是娱乐,你会明白为什么。

3。跳过没有N

的标志

是的,有一种方法可以使用[skip=N]标记而不包括 N RewriteRule的数量要应用{{1}堆栈到。那就是......如果你在每个[skip]之前加入一对RewriteRule,哦,是的,最后还有一个{。}}。

RewriteCond

这里的技巧是当且仅当RewriteCond成功时才会处理每个RewriteRule规则,并且当且仅当它们失败时才会处理每个# 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 规则

4。网址标记

使用部分网址来保存状态,然后在[skip=1]中与之匹配。

RewriteCond

带有标记的新网址无效,但最后[skip=2]还原它,对吧?好吧,只有在它被处理之后,所以不要让标记URL在它被恢复之前逃脱这一轮mod_rewrite处理。那你就得到404了。

答案 1 :(得分:20)

Q1:默认为AND。

Q2:它们只会影响下面的RewriteRule。

答案 2 :(得分:16)

你不能这样做。您必须重复使用RewriteConds或使用引用重新考虑重写规则,以便在一个规则中完成所有操作。第一条路线虽然不漂亮,但却是最简单的路线。所以

RewriteCond A
RewriteCond B
RewriteRule 1

RewriteCond A #duplicate
RewriteCond B #duplicate
RewriteRule 2