location / {
try_files $uri $uri/ /index.html;
}
在 /admin/order 页面按 F5 直接返回 nginx 404 页面,控制台报 GET https://example.com/admin/order 404 (Not Found),从首页点菜单进去却一切正常,只有刷新才复现,部署上线后才出现。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:前端路由靠 history.pushState 改地址,服务端收到 /admin/order 会按真实路径去找同名文件,找不到就直接 404,根本没有回退到入口 HTML,这条路必须由服务端兜住。
「history 模式回退」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
处理上按这个顺序:nginx 里加 try_files 把找不到的路径回退到 index.html;确认静态资源 location 的优先级高于这条回退规则,别被抢走;部署在子目录时同步设置 publicPath 和路由 base,路径才对得上。
确认没问题再收工,任意子路由直接访问和刷新都返回 200,页面正常渲染不再出现 nginx 404。
