Nginx可通过map预定义$device_type变量识别设备类型,再在location中用if结合alias或proxy_pass实现移动端与PC端自动分流;也可按路径前缀(如/m/、/pc/)轻量级分流。
用 Nginx 的
块实现移动端与 PC 端自动分流,核心是先识别设备类型,再结合路径规则做差异化处理。不推荐在
级大量用
,而应优先用
预定义变量,再在
中引用,兼顾性能与可维护性。
识别设备类型:用 map 指令预判
在
块顶部添加:
该规则覆盖主流移动 UA 特征,匹配不区分大小写;变量
可在后续任意
中直接使用。
按设备类型提供不同静态资源目录
适合统一访问路径(如
),后端自动选物理目录的场景。注意必须用
,不能用
(
不支持条件切换):
移动资源放在
桌面资源放在
块内通过
判断并设置
(
在
内是安全且常用的做法)
配置示例:
⚠️ 注意:
路径末尾必须带斜杠,且与
的斜杠严格对应(
→
)。
按设备类型代理到不同后端服务
适用于前后端分离架构,移动端和 PC 端由不同应用服务支撑:
定义两组 upstream:
在
或具体接口路径中,用
动态切换:
⚠️ 关键限制:
必须写在
块内部,不能放在
级顶层。
同域名下按路径前缀分流(轻量级方案)
若不想依赖 UA 判断,也可约定路径规范,例如:
移动端请求固定走
PC 端请求走
或根路径
配置更简单、稳定,无需解析 UA:
表示前缀匹配且优先于正则,避免被后续规则覆盖,适合高频路径。
locationserverifmaplocationhttpmap $http_user_agent $device_type {
~*"(iPhone|iPad|iPod|Android|Mobile|Fennec|Windows Phone)" "mobile";
default "desktop";
}$device_typelocation/static/xxx.pngaliasrootroot/var/www/static/mobile//var/www/static/desktop/location /static/ifaliasiflocationlocation /static/ {
if ($device_type = "mobile") {
alias /var/www/static/mobile/;
}
if ($device_type = "desktop") {
alias /var/www/static/desktop/;
}
expires 1h;
add_header Cache-Control "public";
}aliaslocationlocation /static/alias /path/upstream backend-mobile {
server 127.0.0.1:8081;
}
upstream backend-desktop {
server 127.0.0.1:8080;
}location /proxy_passlocation / {
if ($device_type = "mobile") {
proxy_pass http://backend-mobile;
}
if ($device_type = "desktop") {
proxy_pass http://backend-desktop;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}if + proxy_passlocationserver/m/xxx/pc/xxxlocation ^~ /m/ {
alias /var/www/mobile/;
try_files $uri $uri/ /m/index.html;
}
location ^~ /pc/ {
alias /var/www/desktop/;
try_files $uri $uri/ /pc/index.html;
}^~