Sam*_*Sam 23 apache url mod-rewrite apache2
Q1:如何将这两个条件联系起来Q2:如何让它们坚持下面的所有重写规则而不仅仅是第一条规则?if BOTH A AND B, then proceed...
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 -- #
Run Code Online (Sandbox Code Playgroud)
mxx*_*xxk 38
这里有一些技巧可以让RewriteCond堆栈应用于多个RewriteRule,通过每分钟增加WTF来排序.但这是配置而不是代码,因此这些规则不适用,对吧?:-)
当你有很多时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
Run Code Online (Sandbox Code Playgroud)
这个有点微妙.使用[S]or [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
Run Code Online (Sandbox Code Playgroud)
这有点像if语句,其中RewriteConds是条件,RewriteRule是代码块.
您获得的重复次数减少了,但权衡的是代码不太清楚,[skip=N]每次从这组N中 添加或删除规则时都必须更新RewriteRule.
好吧,如果你还在读书,你会发现另外两个解决方案,其中WTF的每分钟达到并超过临界点.他们只是为了娱乐,你会明白为什么.
是的,有一种方法可以使用该[skip]标志而不包括N,即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
Run Code Online (Sandbox Code Playgroud)
这里的诀窍是,[skip=1]当且仅当RewriteCond成功的时候[skip=2]才会处理每个规则,并且当且仅当它们失败时才处理每个规则.
使用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
Run Code Online (Sandbox Code Playgroud)
带标记的新网址无效,但最后RewriteRule还原它,对吧?好吧,只有当它被处理时,所以不要让标记URL在它被恢复之前逃脱这一轮mod_rewrite处理.那你就得到404了.
XP8*_*P84 16
你不能这样做.您必须重复使用RewriteConds或重新考虑重写规则,使用引用在一个规则中完成所有操作.第一条路线虽然不漂亮,但却是最简单的路线.所以
RewriteCond A
RewriteCond B
RewriteRule 1
RewriteCond A #duplicate
RewriteCond B #duplicate
RewriteRule 2
Run Code Online (Sandbox Code Playgroud)