.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 个条件中的任何一个匹配时应用的规则。
我正在尝试使一系列重写条件生效,逻辑是这样的
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 个条件中的任何一个匹配时应用的规则。