Nginx 404 是因未按配置路径查找文件:root 拼接路径、location 未匹配请求、权限不足;应检查 location 匹配、改用 alias、验证路径权限,并用 return 200 定位真实路径。

Nginx 把静态资源放在 root 目录之外就 404,根本不是文件“不在服务器上”,而是 Nginx 根本没去你放文件的地方找——它只认 root(或 alias)指令指定的路径,其他位置一概无视。
关键在于:Nginx 不会自动扫描整个文件系统,它只按配置拼路径;路径拼错,就直接返回 404,连磁盘都不碰一下。
? 为什么放外面就 404?常见三类原因
root 拼接逻辑被忽略
root是“追加”路径:location /static/+root /data→ 实际查找/data/static/xxx
如果你把文件放在/opt/assets/js/app.js,但root写的是/var/www,那 Nginx 永远不会去/opt看一眼。location 未覆盖请求路径
前端请求/api/logo.png,但你的location只配了/static/,这个请求压根不进任何静态块,直接走默认location / { ... }——而那里可能配了proxy_pass或空root,结果就是 404。root 路径写错或权限缺失
配置写了root /mnt/upload,但实际文件在/mnt/upload/files;或者目录属主是root,而 nginx 工作用户(如www-data)没有x权限进入目录、没有r权限读文件。
✅ 正确修复方法(按优先级操作)
-
确认请求 URI 和 location 是否匹配
- 查浏览器开发者工具 Network 标签,看报 404 的完整 URL(比如
/assets/main.css) - 在 Nginx 配置中找有没有
location /assets/ { ... }这样的块 - 如果没有,加一个;如果有,检查它是否生效(可用
nginx -T | grep -A5 "location /assets/"查看最终加载的配置)
- 查浏览器开发者工具 Network 标签,看报 404 的完整 URL(比如
-
用 alias 替代 root(推荐用于带前缀的静态路径)
location /assets/ { alias /opt/myapp/public/; # 注意末尾必须有 / expires 1h; }这样
/assets/main.css就直接映射到/opt/myapp/public/main.css,不拼接/assets/,更可控。 -
验证真实路径和权限
- 用
curl -I http://localhost/assets/main.css看响应头 - 登录服务器,手动执行:
ls -l /opt/myapp/public/main.css stat /opt/myapp/public/
- 确保
nginx用户(ps aux | grep nginx查 worker 进程用户)对目录有--x,对文件有-r-
- 用
-
临时加 return 查真实路径(最准定位)
在对应location块里加一行:return 200 "file: $request_filename";
刷新页面,浏览器会显示 Nginx 实际打算读的绝对路径——一眼看出拼得对不对。
⚠️ 特别注意两个易错点
root 和 alias 不能混用在同一 location
root和alias语义冲突,Nginx 会忽略其中一个,行为不可预测。location 块顺序影响匹配结果
更具体的 location(如/assets/js/)要写在更宽泛的(如/assets/)前面,否则可能被后者截断。
不复杂但容易忽略。


















