Nginx实现移动端与PC端目录映射的核心是基于User-Agent自动识别设备并路由到对应静态目录:首选在http块用map指令定义$device_root变量,匹配android/iphone/ipad等设为mobile路径,默认PC路径;location中直接root $device_root;也可用if+rewrite重定向特定路径,或用alias按路径前缀区分。

在 Nginx 中实现移动端与 PC 端不同目录映射,核心是根据请求头中的 User-Agent 自动识别设备类型,并将请求路由到对应静态资源目录。关键不在于写两套 server 块,而是在同一域名下用逻辑判断做路径分发。
用 map 指令预定义设备类型变量
这是最简洁、高效的做法,推荐放在 http 块中(全局生效):
- 定义一个映射变量
$device_root,根据 UA 字符串匹配自动赋值为 PC 或移动端的绝对路径 - 匹配规则要覆盖主流移动标识:Android、iPhone、iPad、iPod、BlackBerry、Mobile 等
- 注意正则修饰符
~*表示忽略大小写,default指定默认(PC)路径
示例配置:
map $http_user_agent $device_root {
default "/www/wwwroot/example.com/pc";
~*(android|iphone|ipad|ipod|blackberry|mobile) "/www/wwwroot/example.com/mobile";
}之后在 server 块中直接引用该变量:
location / {
root $device_root;
index index.html;
try_files $uri $uri/ /index.html;
}用 if + rewrite 实现路径重定向(适合固定子路径)
当需要把特定 URL(如 /a/fwyzc/rjxz/)在手机访问时跳转到另一个路径(如 /a/fwyzc/mrjxz/),且两个路径分别对应不同目录时,适合用此方式:
- 先用
if判断 UA,设置临时变量(如$mobile_request) - 用
rewrite ... redirect发起 302 跳转,让浏览器地址栏变化,再由新路径的location块处理 - 注意:不能在
if块里直接改alias或root,Nginx 不允许
示例片段:
location /a/fwyzc/rjxz/ {
alias /www/wwwroot/example.com/web/;
index software_download.html;
<pre class='brush:php;toolbar:false;'>if ($http_user_agent ~* "(Android|iPhone|iPad|iPod|Mobile)") {
rewrite ^/(.*)$ /a/fwyzc/mrjxz/ permanent;
}}
location /a/fwyzc/mrjxz/ { alias /www/wwwroot/example.com/mobile/; index software_download.html; }
用 location + alias 区分固定二级路径(无需 UA 判断)
如果 PC 和移动端内容通过明确的路径区分(比如用户主动访问 /pc/ 或 /mobile/),就无需 UA 判断,直接靠路径前缀路由:
- 每个
location使用alias指向真实目录,注意末尾斜杠必须一致 -
alias /path/对应location /xxx/:URI 中的/xxx/会被完全替换为/path/ - 避免混用
root和alias,否则路径拼接容易出错
示例:
location /pc/ {
alias /www/wwwroot/example.com/pc/;
index index.html;
}
<p>location /mobile/ {
alias /www/wwwroot/example.com/mobile/;
index index.html;
}</p><h1>主页可默认指向 PC,或加一个首页跳转逻辑</h1><p>location = / {
return 302 /pc/;
}注意事项与常见坑
实际配置时容易忽略以下细节:
-
map必须定义在http块内,不能放在server或location内 -
alias路径末尾带/,则location的路径前缀会被完整替换;若用root,则会在其后拼接完整 URI,易导致 404 -
if在location块中属于“伪指令”,功能受限,仅支持有限操作(如 set、rewrite、return),不可用于改变 root/alias - 移动端 UA 判断不是 100% 准确,部分桌面浏览器(如 Chrome 开发者工具模拟)可能被误判,上线前建议多端实测


















