Nginx 的 index 指令本身不支持设备识别,但可通过 map 解析 User-Agent 映射不同首页文件(如 index-mobile.html),再由 index $device_index 动态生效,实现无重定向、无 JS 的多端适配;需 Nginx ≥ 1.19.1,map 定义在 http 块,匹配用 ~* 不区分大小写,仅适用于体验层分流。

Nginx 的 index 指令本身不直接支持设备识别或访问控制,它只负责定义当请求一个目录时默认返回哪个文件(如 index.html)。但结合 map、if、try_files 和静态文件组织策略,可以实现“基于设备类型加载不同首页”的简易多端适配,即所谓“多设备访问控制”的轻量级落地。
利用 User-Agent 区分设备并映射入口文件
核心思路是通过 map 指令解析请求头中的 User-Agent,将移动/桌面设备映射为不同的 index 文件名,再由 index 指令动态生效:
- 在
http块中定义映射关系:
map $http_user_agent $device_index {
default "index.html";
~*android|ios|mobile|iphone|ipad "index-mobile.html";
}- 在
server或location块中引用该变量:
location / {
root /var/www/site;
index $device_index; # 关键:让 index 支持变量
try_files $uri $uri/ =404;
}这样访问 / 时,Nginx 会根据 UA 自动尝试加载 index-mobile.html(移动端)或 index.html(桌面端),无需重定向、无 JS 介入,响应快且利于 SEO。
配合静态文件结构提升可维护性
保持站点根目录清晰,避免逻辑耦合:
- 推荐将不同终端页面放在同一层级,如:
/var/www/site/index.html、/var/www/site/index-mobile.html - 不建议用子目录(如
/mobile/index.html)再配合重写,否则index指令无法跨路径生效,需额外rewrite或return,增加复杂度 - 可选:为移动页添加简单标识,比如在
index-mobile.html中加<meta name="viewport" content="width=device-width">,确保渲染正确
注意边界情况与限制
该方案轻量但有明确适用边界:
-
index指令仅支持变量(Nginx ≥ 1.19.1),旧版本会报错;确认版本可用nginx -v -
map是全局块指令,不能写在server内;匹配区分大小写,故使用~*进行不区分大小写的正则匹配 - 纯 UA 判断不可靠(可被伪造),不适用于安全敏感的设备权限控制;仅适合体验层分流
- 若需更精细控制(如平板单独处理),可扩展
map规则,例如追加~*tablet|ipad→"index-tablet.html"
替代思路:用 try_files + 变量实现更灵活回退
当需要优先尝试设备专用页、不存在时降级到通用页,可跳过 index,改用 try_files:
location / {
root /var/www/site;
set $page "index.html";
if ($http_user_agent ~* "(android|ios|mobile|iphone)") {
set $page "index-mobile.html";
}
try_files /$page /index.html =404;
}此写法兼容更低版本 Nginx(虽 if 在 location 中有性能警告,但用于简单 UA 判断影响极小),且语义更明确:先找移动页,找不到就用桌面页。

















