Nginx部署前端多路由项目时,root仅指定静态资源根目录,关键靠try_files实现路由兜底;正确配置为root /var/www/myapp; + try_files $uri $uri/ /index.html;,确保刷新不报404。
前端多路由项目(比如 Vue Router 或 React Router 的 History 模式)部署到 Nginx,root 配置本身不决定路由行为,真正起作用的是 try_files 指令。root 只负责告诉 Nginx 静态文件放在哪,而多路由能否刷新不报 404,关键在于请求兜底逻辑。
root 定义的是静态资源的根目录路径,Nginx 会把 location 匹配到的 URI 拼接到 root 路径后面去查找文件。
root /usr/share/nginx/html; + location /admin/ { ... } → 实际查找 /usr/share/nginx/html/admin/
/var/www/myapp/,就该写:root /var/www/myapp;
/ 不强制,root /var/www/myapp 和 root /var/www/myapp/ 效果一致History 模式下,用户访问 /user/123 或刷新页面时,Nginx 默认尝试找 /user/123 对应的物理文件——但这个文件不存在,就会返回 404。解决方法是让所有未命中静态资源的请求都 fallback 到 index.html,由前端路由接管。
try_files $uri $uri/ /index.html;
$uri:先查真实文件(如 js/app.js、css/main.css)$uri/:再查是否为目录(如访问 /about/)/index.html:以上都不匹配时,返回根目录下的 index.html,保证 SPA 路由生效以下写法看似合理,实则会导致子路由刷新失败或资源加载异常:
root,没加 try_files → 刷新任意非根路径必 404root /var/www/myapp/dist; + location / { ... } → 实际查找路径变成 /var/www/myapp/dist//index.html(双斜杠不影响,但语义冗余)root /var/www/myapp; + index index.html; + try_files $uri $uri/ /index.html;,dist 内容直接放 /var/www/myapp/ 下即可如果一台服务器要跑多个前端项目,不推荐全靠一个 server 块内用不同 location + alias 来区分(易出路径歧义)。更清晰的做法是:
root 指向各自 dist 根目录server { listen 8081; root /var/www/app-a; ... try_files $uri $uri/ /index.html; }