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 -- #
答案 0 :(得分:34)
以下是使RewriteCond
堆栈适用于多个RewriteRule
的一些技巧,按增加WTF's per minute排序。但这是配置而不是代码,因此这些规则不适用,对吗? : - )
当你有很多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
这个有点微妙。使用[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达到并超过临界点的解决方案。他们只是娱乐,你会明白为什么。
是的,有一种方法可以使用[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
规则
使用部分网址来保存状态,然后在[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