核心思路是利用$http_user_agent识别设备类型,通过重定向或root路径切换实现Nginx层自动适配;支持域名跳转、目录切换及Cookie手动覆盖,轻量高效。

核心思路是利用 $http_user_agent 变量识别设备类型,再通过重定向或资源路径切换实现自动适配。不依赖后端,纯 Nginx 层完成,轻量且高效。
识别移动端设备的关键正则
Nginx 本身不内置设备识别逻辑,需手动匹配常见移动端 UA 字符串。推荐使用较全面的模式,覆盖主流手机系统和浏览器:
-
基础写法(简洁常用):
~* "(android|iphone|ipad|ipod|blackberry|webos|iemobile|opera mini|mobile)" - 增强写法(更严谨):参考 detectmobilebrowsers.com 提供的完整正则,包含 Nokia、HTC、Samsung、Windows Phone 等老旧但仍有流量的 UA 特征
- 注意大小写不敏感用
~*,避免漏判;匹配失败时默认视为 PC 端
方式一:域名级跳转(推荐用于分离站点)
适用于 PC 站(如 www.example.com)与 H5 站(如 m.example.com)完全独立部署的场景。需配置两个 server 块:
-
PC 域名 server 块中加入:
if ($http_user_agent ~* "(android|iphone|ipad)") { rewrite ^(.*)$ https://m.example.com$1 permanent; } -
移动域名 server 块中加入:
if ($http_user_agent !~* "(android|iphone|ipad)") { rewrite ^(.*)$ https://www.example.com$1 redirect; } - 注意 HTTPS 下需确保两个域名都已配置有效证书,
permanent返回 301,redirect返回 302
方式二:目录级资源切换(适合单域名部署)
若 PC 与移动页面共用一个域名(如都走 example.com),仅静态资源路径不同,可用 root 指令动态切换:
- 先用
map指令定义变量,提升可读性和复用性:map $http_user_agent $site_root { default "/usr/share/nginx/html/pc"; ~* "(android|iphone)" "/usr/share/nginx/html/mobile"; } - 在
location /中直接引用:root $site_root; - 这样无需 if 判断,性能更好,也避免了 if 在 location 中的潜在限制问题
补充体验:支持用户手动切换
自动识别可能误判,应提供“电脑版/手机版”入口,并通过 Cookie 让 Nginx 尊重用户选择:
- 在手机版页面加链接:
@#@#@#@#@#@#@#@#@#@0,后端或前端 JS 设置 Cookieprefer=pc - Nginx 中增加判断:
if ($http_cookie ~ "prefer=pc") { set $is_mobile 0; }if ($http_cookie ~ "prefer=mobile") { set $is_mobile 1; } - 后续逻辑基于
$is_mobile而非原始 UA,优先级更高
不复杂但容易忽略











