Nginx 支持 SPA 路由需分层配置:静态资源用正则 location 优先直通并缓存;主路由 location / 内用 try_files $uri $uri/ /index.html 兜底;API 接口须独立 location 代理,禁止混入 try_files;子路径部署需用 alias 配合调整兜底路径。

Nginx 用 try_files 支持单页应用(SPA)路由,关键不是“让所有请求都走 try_files”,而是精准分层:静态资源直通、API 独立代理、前端路由兜底。核心在于避免误伤真实文件,同时确保 /user 这类路径最终落到 index.html。
静态资源必须优先匹配,不进 try_files 流程
JS、CSS、图片等带哈希名的资源(如 `app.a1b2c3.js`)必须由 Nginx 直接返回,不能被 `try_files $uri $uri/ /index.html` 拦截——否则浏览器拿到 HTML 却当 JS 执行,直接报错。推荐在 `location /` 前添加正则匹配块:
- 写在 `server` 块靠前位置,确保优先级高于 `location /`
- 用 `~*` 忽略大小写,覆盖常见资源后缀
- 可顺带加缓存头提升性能
示例配置:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot|webp)$ {expires 1y;
add_header Cache-Control "public, immutable";
}
主路由用 try_files 兜底,但只作用于 location /
`try_files` 必须放在 `location / { ... }` 块内,且与 `root` 配合使用。它本身不处理资源类型判断,只按顺序检查:- $uri:查精确路径是否存在文件,如 `/assets/logo.png` → 直接返回
- $uri/:查是否为目录,如 `/docs/` → 尝试返回该目录下的 `index.html`
- /index.html:以上都失败时,内部重写并返回根目录下的 `index.html`
基础结构示例:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
root /var/www/my-spa;
try_files $uri $uri/ /index.html;
}
API 接口必须独立 location,严禁混入 try_files
如果后端接口走 `/api/`,而你没单独配置,Nginx 会把 `/api/users` 当作普通路径,先查文件、再查目录、最后 fallback 到 `/index.html`——前端收到的是 HTML 字符串,解析 JSON 时必然崩溃。- 用 `location /api/` 显式声明,路径以 `/` 结尾,确保最长前缀匹配
- 该块内只保留 `proxy_pass` 和必要 header,不写 `try_files`
- 多个后端路径(如 `/auth/`、`/v1/`)也需同理剥离
示例:
location /api/ {proxy_pass http://backend-server/;
proxy_set_header Host $host;
}
子路径部署要同步调整 alias 和兜底路径
若 SPA 部署在 `https://example.com/admin/`,不能用 `root`,必须改用 `alias`,且 `try_files` 的兜底项要对应子路径:- `alias /var/www/admin/dist/;` 后必须带末尾 `/`,否则路径拼接错误
- `try_files $uri $uri/ /admin/index.html;` 中的 `/admin/index.html` 是相对于 alias 根目录的逻辑路径
- 前端构建时也要设 `base: "/admin/"`,保证 JS 加载资源路径正确
配置片段:
location /admin/ {alias /var/www/admin/dist/;
try_files $uri $uri/ /admin/index.html;
}
不复杂但容易忽略


















