跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何配置 location 块 实现对移动端与 PC 端访问路径的自动分流

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; }
^~
表示前缀匹配且优先于正则,避免被后续规则覆盖,适合高频路径。

相关文章