Apache 2.4中HTTP_USER_AGENT变量的正则表达式使用问题求助
Apache 2.4中HTTP_USER_AGENT变量的正则表达式使用问题求助
兄弟,我一眼就瞅出你卡在哪了!你在Apache 2.4的<If>指令里用错了匹配规则的核心操作符,这才导致所有正则都不管用~
问题根源:用错了匹配操作符
Apache 2.4的<If>表达式里,==是精确字符串匹配——意思是它会把你右边的内容当成普通字符串,判断User-Agent是否和它完全一模一样,而不是当做正则来解析!要实现正则匹配,得用专门的正则匹配操作符:
=~:表示“匹配正则成功”!~:表示“匹配正则失败”
而且正则模式的写法也有讲究,不需要额外加单引号,直接用/把正则规则包裹起来就行。
给你修正后的正确写法
这是符合Apache语法的版本,直接就能用:
<If "%{HTTP_USER_AGENT} =~ /^.*(Google|bing|Windows|Gecko).*$/"> Require all granted </If>
额外优化建议
其实你写的^.*和.*$有点多余——因为正则默认是部分匹配,只要User-Agent里包含这些关键词就会命中,所以可以简化成:
<If "%{HTTP_USER_AGENT} =~ /Google|bing|Windows|Gecko/"> Require all granted </If>
如果想忽略大小写(比如兼容google和Google两种写法),还可以给正则加个i修饰符:
<If "%{HTTP_USER_AGENT} =~ /google|bing|windows|gecko/i"> Require all granted </If>
为啥你之前的尝试都失败?
- 用
==的所有写法,都是在判断User-Agent是否完全等于你写的正则文本(比如'^.*(Google|bing|Windows|Gecko).*$'),这显然不可能,所以永远匹配不上; - 额外加的单引号、
~符号都是画蛇添足,Apache的正则匹配语法不需要这些。
备注:内容来源于stack exchange,提问作者Wi Fi
相关产品推荐
相关产品推荐

