setenvif 指令可轻量标记 ua:匹配 ie、安卓 chrome、ios safari、主流爬虫;注意转义点号与或符、加 i 修饰符、锚定词边界;变量需在 logformat 或 require 中显式引用,且须置于 virtualhost 中、重写前,命名用下划线。

直接用 SetEnvIf 指令匹配 User-Agent 字符串,就能为不同客户端打上环境标签——这不是猜测或重写,而是 Apache 在请求解析早期就完成的轻量级标记动作。
识别常见 UA 并设置基础变量
浏览器、爬虫、移动端都有典型标识,正则要覆盖主流变体,避免漏判:
-
SetEnvIf User-Agent "MSIE\|Trident" IS_IE=1(匹配 IE6–11) SetEnvIf User-Agent "Chrome.*Mobile\|Android.*Chrome" IS_ANDROID_CHROME=1SetEnvIf User-Agent "iPhone.*Safari\|iPad.*Safari" IS_IOS_SAFARI=1SetEnvIf User-Agent "Baiduspider\|YisouSpider\|Googlebot" IS_BOT=1
注意:点号 . 必须转义为 \.,否则表示“任意字符”;多个关键词用 \| 连接(不是 |,Apache 2.4+ 正则语法要求反斜杠转义)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
处理大小写与模糊匹配
UA 字符串大小写不统一,且可能含多余空格或版本号干扰,需加修饰符和锚定:
- 加
i标志实现不区分大小写:SetEnvIf User-Agent "mobile"i IS_MOBILE=1 - 用
^和$锚定完整词(可选):SetEnvIf User-Agent "^Mozilla/5\.0.*Firefox$" IS_FIREFOX=1 - 避免空格误触发:引号内前后不能有空格,
" Mobile "会匹配失败,应写成"Mobile"
配合日志与访问控制使用
设好变量后不会自动生效,必须在 LogFormat 或 Require 中显式引用:
- 日志中输出:
LogFormat "%h %l %u %t \"%r\" %>s %b %{IS_BOT}e %{IS_MOBILE}e" ua_log,再配CustomLog logs/access.log ua_log env=IS_BOT只记录爬虫请求 - 拒绝移动端访问某接口:
<location> Require all granted Require not env IS_MOBILE </location> - 允许仅 iOS Safari 访问:
Require env IS_IOS_SAFARI(注意该变量存在且非空即满足)
避坑要点
这些细节不注意,变量看似设了却始终为空:
-
SetEnvIf必须放在<virtualhost></virtualhost>或主配置中,.htaccess里只能继承父配置已定义的变量,不能新增 - 若同时用了
mod_rewrite,SetEnvIf应放在重写规则之前,否则匹配的是原始 UA,不是重写后的 - 变量名不要含短横线(如
is-mobile),Apache 解析失败;推荐下划线命名,如is_mobile - PHP 中读不到?确认用了
PassEnv IS_MOBILE,且 PHP 是通过 CGI/FCGI 方式运行(PHP-FPM 需额外透传)









