我试图让一系列重写条件正常工作,逻辑就是这个
if condition1 or
(condition2 and condition3) or
..
这就是我在.htaccess中所拥有的:
RewriteCond %{HTTP_USER_AGENT} "iphone" [OR,NC]
RewriteCond %{HTTP_USER_AGENT} "android&mobile" [OR,NC]
RewriteCond %{HTTP_USER_AGENT} "iemobile" [NC]
不幸的是,看起来操作员并没有像我想象的那样工作。
(正如你可能猜到的,这个想法是检测Android手机而不是平板电脑)
有没有办法写出这个和条件来实现我正在寻找的结果?
感谢。
答案 0 :(得分:1)
不幸的是,[OR]
标志的效果还不够好,它只适用于所有"或"' d或全部&# 34;和"条件。它不是很容易预测。您可能需要做的是将它们分成几个规则,并使用S
标记来跳过内容或传递。
可能有以下几点:
# Prevent rewrite looping
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
# if "iphone" OR
RewriteCond %{HTTP_USER_AGENT} "iphone" [NC]
RewriteRule ^ - [S=3]
# "android" AND "mobile", OR
RewriteCond %{HTTP_USER_AGENT} "android" [NC]
RewriteCond %{HTTP_USER_AGENT} "mobile" [NC]
RewriteRule ^ - [S=2]
# "iemobile"
RewriteCond %{HTTP_USER_AGENT} "iemobile" [NC]
RewriteRule ^ - [S=1]
# skip everything, none of the conditions match
RewriteRule ^ - [L]
# apply the rule
RewriteRule ^ /do-something [L]
看起来像是一团糟,但那是你的mod_rewrite。
第一条规则是防止任何类型的内部重写循环。 "#跳过所有内容"规则是在3个条件都不匹配的情况下应用的规则,它基本上什么都不做,除了停止任何重写。如果您想要应用所有这些内容之后还有其他规则,则可以将L
标记替换为S=1
。
最后一条规则是在3个条件中的任何一个匹配时应用的规则。