Nginx 实现移动端与 PC 端域名分流需基于 $http_user_agent 识别设备类型,推荐用 map 预定义 $is_mobile 变量,再在 server 块中用 if 判断并 return 302 跳转至对应域名,同时需防范 UA 伪造、优先启用 HTTPS、测试阶段使用 302 避免缓存。

在 Nginx 中实现移动端与 PC 端域名分流,核心是通过 rewrite 指令结合 $http_user_agent 变量识别设备类型,再配合 return 或 rewrite ... permanent 跳转到对应域名。但需注意:单纯依赖 UA 识别有局限性,实际建议搭配 if 判断 + 域名重定向,且优先在 server 块中处理,避免 location 内嵌套复杂逻辑。
识别移动端 UA 并跳转到 m.example.com
Nginx 不支持正则直接匹配 UA 后跳转,需用 if 捕获常见移动 UA 特征(如 iOS、Android、Mobile),再执行重定向:
server {
listen 80;
server_name example.com www.example.com;
<pre class="brush:php;toolbar:false;"># 移动端 UA 匹配(不区分大小写)
if ($http_user_agent ~* "(iPhone|iPad|iPod|Android|Mobile|BlackBerry|Opera Mini|IEMobile)") {
return 302 https://m.example.com$request_uri;
}
# 其余请求走 PC 端(可选:强制跳 https)
return 302 https://www.example.com$request_uri;
}
说明:
• ~* 表示忽略大小写的正则匹配
• $request_uri 保留原始路径和参数,确保跳转后地址完整
• 使用 return 302 更安全,上线前可先测试,稳定后改 301
PC 端访问 m.example.com 时反向跳回 www.example.com
防止用户手动输入或缓存导致移动域名被 PC 访问,可在 m 域名的 server 块中做反向判断:
server {
listen 80;
server_name m.example.com;
<pre class="brush:php;toolbar:false;"># 若非移动端 UA,跳回 PC 域名
if ($http_user_agent !~* "(iPhone|iPad|iPod|Android|Mobile|BlackBerry|Opera Mini|IEMobile)") {
return 302 https://www.example.com$request_uri;
}
# 移动端正常处理静态资源或代理到后端
root /var/www/mobile;
index index.html;
}
更可靠的做法:用 map 预定义变量替代重复 if
多个 if 易出错,且 if 在 location 中受限。推荐用 map 提前生成布尔变量,提升可读性和性能:
http {
# 定义 $is_mobile 变量,值为 1 或空字符串
map $http_user_agent $is_mobile {
default 0;
"~*iPhone" 1;
"~*iPad" 1;
"~*Android" 1;
"~*Mobile" 1;
"~*BlackBerry" 1;
"~*Opera Mini" 1;
"~*IEMobile" 1;
}
<pre class="brush:php;toolbar:false;">server {
listen 80;
server_name example.com www.example.com;
if ($is_mobile = 1) {
return 302 https://m.example.com$request_uri;
}
return 302 https://www.example.com$request_uri;
}
}
注意:
• map 必须定义在 http 块顶层,不能在 server 内
• 值匹配顺序从上到下,default 放最后
• 此方式避免重复正则编译,适合高并发场景
补充建议与注意事项
• 不要仅靠 UA 判断:部分桌面浏览器(如 Chrome 开发者工具模拟)会发送移动 UA;微信内置浏览器 UA 含 Mobile 但运行在桌面系统。关键业务建议前端 JS 配合 localStorage 或服务端二次校验屏幕宽度。
• HTTPS 优先:所有 return 跳转目标应使用 https://,避免混合协议问题。
• 缓存影响:301 跳转会缓存,测试阶段务必用 302,清除浏览器 DNS 和重定向缓存后再验证。
• 静态资源统一处理:PC 和移动站点若共用 CSS/JS,可通过 try_files 或独立 location 规则避免重复跳转。











