Nginx通过map或if结合$http_user_agent正则匹配移动端UA(如iPhone|Android|Mobile等),排除/m/路径后,用rewrite将请求301/302重定向至/m/路径,推荐map方式更安全高效。

在 Nginx 中实现移动端访问自动重定向到微端页面(如 /m/ 或 /mobile/),核心是通过 rewrite 指令结合 $http_user_agent 变量识别移动设备,再执行 302(或 301)跳转。关键在于准确匹配主流移动 UA,同时避免误判 PC 端的 Chrome/Firefox 移动调试模式或爬虫。
识别移动端 User-Agent
Nginx 本身不内置“移动端检测”,需手动用正则匹配常见移动 UA 字符串。推荐使用较宽泛但可靠的模式,覆盖 iOS、Android、Windows Phone 等:
-
iPhone|iPad|iPod—— 苹果全系设备 -
Android—— 安卓手机和平板(注意:部分安卓平板 UA 含Mobile,但并非全部) -
Mobile—— 通用标识(需谨慎,部分桌面版 QQ 浏览器也含此词) -
BlackBerry|IEMobile|Windows Phone—— 小众但仍有存量
建议组合为:~* (iPhone|iPad|iPod|Android|Mobile|BlackBerry|IEMobile|Windows Phone),其中 ~* 表示忽略大小写的正则匹配。
配置 rewrite 规则(推荐放在 server 块内)
以下为典型配置,将所有非微端路径的移动端请求,302 重定向至对应 /m/xxx 路径:
if ($http_user_agent ~* "(iPhone|iPad|iPod|Android|Mobile|BlackBerry|IEMobile|Windows Phone)") {
set $is_mobile 1;
}
if ($request_uri ~ "^/m/") {
set $is_mobile 0;
}
if ($is_mobile = 1) {
rewrite ^(.*)$ /m$1? permanent;
}说明:
- 第一段:匹配移动端 UA,标记
$is_mobile - 第二段:排除已访问
/m/开头的请求,防止循环跳转 - 第三段:仅对未进微端且判定为移动端的请求执行重写;
permanent表示 301(永久重定向),如需临时跳转可改用redirect(302) -
rewrite ^(.*)$ /m$1?中的?可清空原始 query string;若需保留参数,去掉?即可(如/m$1)
更健壮的替代方案:使用 map + rewrite(推荐)
相比 if,map 更高效、更安全(if 在 location 外使用有隐式限制)。推荐如下写法:
map $http_user_agent $is_mobile {
default 0;
~*[iI][pP]h[oO]n[eE] 1;
~*[iI][pP]a[A]d 1;
~*[aA][nN][dD][rR][oO][iI][dD] 1;
~*[mM][oO][bB][iI][lL][eE] 1;
~*[bB][lL][aA][cC][kK][bB][eE][rR][rR][yY] 1;
~*[wW][iI][nN][dD][oO][wW][sS] [pP][hH][oO][nN][eE] 1;
~*[iI][eE][mM][oO][bB][iI][lL][eE] 1;
}
<p>server {
listen 80;
server_name example.com;</p><pre class="brush:php;toolbar:false;"># 排除 /m/ 已经访问的路径
if ($request_uri ~ ^/m/) {
set $is_mobile 0;
}
if ($is_mobile = 1) {
rewrite ^(.*)$ /m$1? redirect;
}
location / {
# 正常 PC 端处理逻辑
try_files $uri $uri/ /index.html;
}
location /m/ {
# 微端静态资源或后端入口
alias /var/www/mobile/;
try_files $uri $uri/ /m/index.html;
}}
注意事项与避坑点
-
避免误伤微信内置浏览器:微信 Android UA 含
MicroMessenger和Android,会被正常匹配;iOS 微信含iPhone和MicroMessenger,也属合理范围。无需特殊排除(除非业务明确要求微信走 PC 版) -
不建议屏蔽平板:iPad、Android 平板屏幕大但仍是触控操作,多数场景应归入微端。如需区分,可用
!(iPad|Tablet)辅助判断,但会增加复杂度 -
测试务必用真机 UA:Chrome DevTools 的模拟器 UA 不完全等同真实设备,建议用手机直接访问或 curl 指定 UA 测试:
curl -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15..." http://example.com -
静态资源(CSS/JS/图片)不要重定向:确保
/m/下的资源路径独立,或通过 location 精确控制,避免因重写导致资源 404
配置完成后,执行 nginx -t 校验语法,再 nginx -s reload 生效。不复杂但容易忽略细节。


















