解决静态文件404需确保alias被正确计算、路径真实存在且无规则干扰:严格配对location与alias尾部斜杠,手动推导实际文件路径并验证存在性、权限及selinux设置,排除正则location和其他location匹配干扰。

用 alias 解决静态文件 404,关键不是“加了 alias 就能好”,而是确保它被正确计算、真实存在、且不被其他规则干扰。下面直接说实用要点。
检查 location 和 alias 的斜杠是否严格配对
alias 是字符串替换,不是拼接。斜杠错一位,路径就粘连或多余:
- ✅ 正确写法:location /assets/ { alias /opt/app/public/; } → 请求
/assets/js/app.js对应磁盘路径/opt/app/public/js/app.js - ❌ 错误写法1:location /assets/ { alias /opt/app/public; } → 实际找
/opt/app/publicjs/app.js(public和js粘在一起) - ❌ 错误写法2:location /assets { alias /opt/app/public/; } → 实际找
/opt/app/public/assets/js/app.js(多出一层assets)
统一用带尾斜杠的写法最稳妥:location 以 / 结尾,alias 值也必须以 / 结尾。
手动推导 Nginx 实际访问的文件路径
别猜,一步步算出来再验证:
- 写出请求 URL,例如:
https://example.com/static/css/main.css - 找到匹配的 location,比如:
location /static/ { alias /var/www/dist/; } - 去掉匹配前缀:
/static/被完全移除,剩下css/main.css - 把 alias 值直接拼上去:
/var/www/dist/+css/main.css=/var/www/dist/css/main.css - 在服务器上执行:
ls -l /var/www/dist/css/main.css,确认文件存在、大小写完全一致
确认权限和 SELinux 是否拦路
Linux 下 404 可能是权限问题伪装的:
- Nginx 进程用户(如
www-data或nginx)必须对整个路径有 x 权限才能进入目录,有 r 权限才能读文件 - 运行:
ls -ld /var/www/dist→ 确保有dr-xr-xr-x类似权限(至少含x) - 运行:
ls -l /var/www/dist/css/→ 确认子目录和文件都有r - 若启用了 SELinux:
ls -Z /var/www/dist,必要时执行:chcon -Rt httpd_sys_content_t /var/www/dist
排除 location 匹配干扰
alias 配置再对,也可能被别的规则抢走请求:
- alias 不能用于正则 location(如
location ~ ^/api/),Nginx 会忽略它,退回到 root 行为 - 检查有没有更宽泛的
location /或location ~ \.php$把请求提前截走了 - 用
nginx -T输出最终生效配置,确认你改的是实际加载的那个 server 块 - 临时加一行:
return 200 "real path: $request_filename";,curl 一下看 Nginx 自己认为的路径是什么











