apache可通过user-agent识别移动端设备并自动路由:支持重定向至m子域、内部重写移动资源、设置环境变量供后端判断,需注意排除平板、添加nc标志、用302测试、配合vary头及ua校验。

在 Apache 层基于 User-Agent(UA)实现移动端小屏幕设备的资源自动路由,是服务端多端适配中响应快、兼容稳、不依赖前端 JS 的关键一环。它不改变 URL,却能为手机用户返回精简 HTML、压缩 JS/CSS,或直接重定向到 m.example.com,避免把 PC 端整套资源硬塞给小屏设备。
核心原理:用 mod_rewrite 拦截并识别 UA
Apache 默认启用 mod_rewrite 模块。我们通过 SetEnvIfNoCase 或 RewriteCond 提取 UA 字符串中的关键标识,再用 RewriteRule 执行跳转或内部重写。
- 常见移动端 UA 特征词:Android、iPhone、iPad、Mobile、IEMobile、Windows Phone、UCBrowser、MiuiBrowser
- 注意排除平板(如 iPad、Android 平板)误判:可结合
!iPad、!Tablet等否定条件,或用更细粒度规则区分 - 推荐优先使用
RewriteCond %{HTTP_USER_AGENT},语义清晰、调试方便
实战配置:三类典型场景写法
① 纯重定向到移动子域(推荐用于独立站点)
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} "Android|iPhone|Windows Phone|IEMobile|UCBrowser|MiuiBrowser" [NC]
RewriteCond %{HTTP_HOST} !^m\. [NC]
RewriteCond %{REQUEST_URI} !^/robots\.txt$ [NC]
RewriteRule ^(.*)$ https://m.%{HTTP_HOST}/$1 [R=302,L]
② 内部重写,动态加载移动版资源(适合单域名 SSR 场景)
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} "Android|iPhone" [NC]
RewriteCond %{REQUEST_URI} ^/index\.html$ [NC]
RewriteRule ^index\.html$ /mobile/index.html [L]
③ 条件性设置环境变量,供后端 PHP/Python 读取(解耦更彻底)
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
SetEnvIfNoCase User-Agent "Android|iPhone|Mobile" IS_MOBILE=1 SetEnvIfNoCase User-Agent "iPad|Tablet" IS_TABLET=1
后端可通过 $_SERVER['IS_MOBILE'](PHP)或 os.environ.get('IS_MOBILE')(WSGI)判断并渲染对应模板。
避坑要点与优化建议
UA 字符串可伪造,但对真实用户流量识别率超 95%,足够支撑首屏路由决策。真正要防的是恶意爬虫或测试工具,可叠加 IP 白名单或 UA 长度校验。
- 务必加
[NC]标志,忽略大小写,避免 iPhone/iPhone OS/iOS 等变体漏判 - 用
R=302而非R=301做初期测试,防止缓存导致重定向逻辑难以回退 - 排除静态资源(.js/.css/.png)和 robots.txt 的重写,避免干扰 CDN 或 SEO
- 配合 Vary: User-Agent 响应头(
Header append Vary User-Agent),确保 CDN 正确缓存不同版本
验证是否生效
打开终端,用 curl 模拟移动端请求:
curl -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1" -I https://example.com
观察返回状态码是否为 302 + Location 头,或响应内容是否为 mobile/index.html。也可在浏览器开发者工具 Network 面板中修改 UA 后刷新页面验证。










