nginx支持spa需用try_files实现路由回退:根路径用root+try_files $uri $uri/ /index.html;子路径用alias+try_files $uri $uri/ /myapp/index.html并配base href;api路径需前置location /api/ proxy_pass;静态资源应正则单独缓存。

要让 Nginx 正确支持单页应用(SPA)的前端路由,关键是在 location / 块中用 try_files 实现“找不到就回退到 index.html”的逻辑,而不是返回 404。这能确保用户直接访问或刷新 /user/profile、/dashboard 这类路径时,页面正常加载,由前端路由接管渲染。
基础配置:根路径部署
适用于构建产物部署在网站根目录(如 https://example.com/)的场景:
- 确保
root指向实际静态文件所在路径,例如root /var/www/myapp; - 显式声明默认首页:
index index.html; - 在
location /中写入:try_files $uri $uri/ /index.html;
含义是:先查请求路径是否对应真实文件(如 /js/app.js),再查是否为真实目录(如 /assets/),都失败则内部返回根目录下的 index.html,URL 地址栏不变。
子路径部署:用 alias + 调整 fallback 路径
若应用部署在子路径下(如 https://example.com/myapp/),不能直接用 root,否则资源路径会错乱:
- 使用
alias指向子应用目录,末尾必须带斜杠:alias /var/www/myapp/; -
try_files中的 fallback 要写成相对 alias 根目录的路径:try_files $uri $uri/ /myapp/index.html; - 前端代码中需设置正确的
<base href="/myapp/">,确保 JS/CSS 资源引用正确
避免 API 请求被兜底
后端接口(如 /api/login)绝不能被 try_files 拉去 index.html,否则接口失效:
- 单独定义
location /api/块,并放在location /之前 - 使用
proxy_pass http://backend/;(结尾斜杠很重要,保证路径透传) - Nginx 按最长前缀匹配,
/api/会优先命中,不会落入根location的try_files流程
提升健壮性:显式处理静态资源
防止因正则或顺序问题导致 JS/CSS 被错误 fallback,可加一层明确的静态资源拦截:
- 添加正则 location,覆盖常见资源后缀:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot|webp)$ - 在里面设置缓存策略,例如:
expires 1y;和add_header Cache-Control "public, immutable"; - 这个块会优先于
location /匹配资源请求,确保它们走正常路径











