Nginx通过map匹配User-Agent设置$is_mobile变量,再结合if重写URI或动态root实现手机端与PC端目录分离。具体为:先在http块定义设备判断规则,再在server中用if重写路径至/m/或用map+root动态切换根目录,最后统一用try_files查找资源。

在 Nginx 中用 try_files 实现手机端和 PC 端目录分离,核心思路是:**先识别设备类型,再按优先级尝试加载对应路径的文件**。它不是靠 try_files 自己判断设备,而是结合 $http_user_agent 或内置变量(如 $mobile)做条件分支,再在每个分支里用 try_files 查找资源。
1. 基于 User-Agent 判断并设置变量
Nginx 本身不直接提供「是否为手机」的布尔变量,需手动匹配常见移动端 UA 特征(如 iPhone、Android、Mobile):
map $http_user_agent $is_mobile {
default 0;
~*[iI]phone 1;
~*[aA]ndroid 1;
~*[Mm]obile 1;
~*[Ff]ennec 1;
~*[Ii]pad 0; # 可选:iPad 视为桌面或单独处理
}把这段加到 http 块中(通常在 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 下的全局配置),之后就能在 server 或 location 中使用 $is_mobile。
2. 在 location 中按设备类型分发请求路径
不能直接在 try_files 里写 if,所以要用 if + rewrite 或更推荐的方式:用两个嵌套的 try_files 分支(通过命名 location 实现)。但最简洁可靠的做法是——用 if 预先重写 URI:
- 如果
$is_mobile = 1,把请求路径前缀改为/m/(比如/index.html→/m/index.html) - 否则保持原路径,或加
/pc/前缀(可选)
示例配置(放在 server 块内):
location / {
if ($is_mobile) {
rewrite ^(.*)$ /m$1 break;
}
try_files $uri $uri/ /index.html;
}
<p>location /m/ {
alias /var/www/html/mobile/;
try_files $uri $uri/ /m/index.html;
}</p><p>location /pc/ {
alias /var/www/html/pc/;
try_files $uri $uri/ /pc/index.html;
}说明:
– 第一个 location / 拦截所有请求,用 if 判断后重写 URI,然后交给 try_files 查找;
– /m/ 和 /pc/ 是实际服务静态文件的 location,注意 alias 末尾有斜杠,且路径需真实存在;
– try_files $uri $uri/ /m/index.html 表示:先找文件,再找目录,最后回退到移动端首页(适合 SPA)。
3. 更健壮的写法:避免 if(推荐用于生产)
if 在 location 中有局限(比如不能嵌套、部分指令不生效),进阶做法是用 map 定义根路径变量,再配合 root 动态切换:
map $is_mobile $root_path {
1 /var/www/html/mobile;
0 /var/www/html/pc;
}
<p>server {
root $root_path;
index index.html;</p><pre class="brush:php;toolbar:false;">location / {
try_files $uri $uri/ /index.html;
}}
这个方案更干净:
– 根据 $is_mobile 直接指定 root 路径;
– 所有请求都走同一套 try_files 逻辑,自动在对应目录下查找;
– 注意:确保 /var/www/html/mobile/index.html 和 /var/www/html/pc/index.html 都存在。
4. 验证与调试技巧
- 用 curl 模拟不同 UA 测试:
curl -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)" http://yoursite.com/ - 开启 Nginx error_log debug 级别(临时),看 rewrite 是否生效、文件是否命中
- 检查文件权限:Nginx 工作进程(如 www-data)必须对 mobile/ 和 pc/ 目录有读取权限
- 浏览器开发者工具 Network 标签页确认返回的是哪个目录下的文件
不复杂但容易忽略细节:UA 匹配要覆盖主流机型,路径别名和 root 的斜杠方向、权限、index 文件名都要一致。做好这些,手机和 PC 就能自然分流了。


















