root 指令本身不支持按终端类型自动切换目录,但可通过 map 指令结合 user-agent 提取设备类型并动态设置 root 路径;需注意 root 在 location 中会拼接完整 uri,故推荐用于根路径 /,子路径场景易出错。

直接用 root 指令本身无法根据终端类型(比如手机/PC)自动切换目录——root 是静态路径指令,不识别用户设备。但可以通过 结合请求头(如 User-Agent)+ map 指令 + 动态变量,在 location 中间接实现“不同终端访问不同目录”的效果。
用 map 提取终端类型并映射 root 路径
在 http 块顶部定义一个映射关系,把常见移动端特征识别为变量:
- 匹配含
Mobile、Android、iPhone的User-Agent→ 设为mobile - 其余默认视为
desktop - 再把这两个标识分别映射到对应目录路径
示例配置:
http {
map $http_user_agent $env_root {
default /var/www/desktop;
"~*Mobile|Android|iPhone" /var/www/mobile;
}
<pre class="brush:php;toolbar:false;">server {
listen 80;
server_name example.com;
location / {
root $env_root; # 使用动态变量
index index.html;
try_files $uri $uri/ =404;
}
}}
注意 root 在 location 中的行为限制
root 指令在 location 内不是“替换前缀”,而是拼接整个 URI 路径。例如:
- 若
location /app/ { root /var/www/mobile; },访问/app/css/style.css实际查找的是/var/www/mobile/app/css/style.css - 这会导致路径多出一层
/app/,容易 404 - 所以这种方案更适合根路径
location /场景,不推荐用于子路径隔离
更稳妥的替代方案:按终端重定向或反向代理
如果目标是彻底分离体验(比如 PC 访问完整版、手机跳转 m.example.com),推荐以下方式:
- 用
if ($http_user_agent ~* "Mobile") { return 302 https://m.example.com$request_uri; } - 为
m.example.com单独配一个server块,root /var/www/mobile - 或者用
proxy_pass把移动端请求转发到另一套后端服务
补充:实际部署前必须验证
确保:
-
/var/www/mobile和/var/www/desktop目录真实存在且权限正确(Nginx 工作进程可读) - 测试时用真实设备或浏览器开发者工具模拟 User-Agent,避免仅靠 curl 默认头误判
- 不要在
location中混用root和alias,二者语义冲突











