.htaccess RewriteCond和条件不按预期工作

时间:2015-01-05 23:04:30

标签: .htaccess

我试图让一系列重写条件正常工作,逻辑就是这个

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手机而不是平板电脑)

有没有办法写出这个和条件来实现我正在寻找的结果?

感谢。

1 个答案:

答案 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个条件中的任何一个匹配时应用的规则。