Nginx可通过map预定义$device_type变量识别设备类型,再在location中用if结合alias或proxy_pass实现移动端与PC端自动分流;也可按路径前缀(如/m/、/pc/)轻量级分流。

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










