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

.htaccess RewriteCond and condition not working as expected

我正在尝试使一系列重写条件生效,逻辑是这样的

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]

不幸的是,and 运算符似乎没有像我想象的那样工作。

(您可能猜到了,这个想法是检测 android 手机而不是平板电脑)

有没有一种方法可以编写它和条件来实现我正在寻找的结果?

谢谢。

不幸的是,[OR] 标志不够好用,它只适用于所有 "or"'d 或所有 "and"'d 条件.这不是很可预测。您可能需要做的是将它们分成几条规则,然后使用 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。

第一条规则是防止任何类型的内部重写循环。 “#skip everything”规则是在 3 个条件中的 none 匹配时应用的规则,它除了停止任何重写外基本上什么都不做。如果您在想要应用所有这些内容之后还有其他规则,则可以将 L 标志替换为 S=1

最后一个规则是在 3 个条件中的任何一个匹配时应用的规则。