Nginx alias挂载虚拟目录时CSS/JS加载失败,主因是location与alias尾部斜杠未严格配对:location /admin/需配alias /var/www/admin/,否则路径拼接错误致404;还需确保前端publicPath匹配、权限充足、路径真实存在并启用try_files兜底。
用 alias 挂载虚拟目录时,CSS 和 JS 文件加载失败,绝大多数情况不是文件本身问题,而是路径映射逻辑没对上——alias 是前缀替换,不是拼接,稍有偏差就 404。
这是最常踩的坑。斜杠位置错了,Nginx 就会把 URI 错误拼接到物理路径里,导致找不到 .css 或 .js 文件:
location /admin/ { alias /var/www/admin/; }请求 /admin/js/app.js → 实际读取 /var/www/admin/js/app.js(/admin/ 被完整剥离)location /api { alias /opt/backend; }请求 /api/v1/user → 实际读取 /opt/backend/v1/user
location /static/ { alias /data/css; }(alias 少了 /)→ 请求 /static/main.css 可能变成 /data/css//main.css,双斜杠触发权限或路径解析失败比如 Vue 或 React 子应用部署在 /admin/ 下,打包时必须设对 publicPath:
vue.config.js 中写 publicPath: '/admin/'
vite.config.ts 中设 base: '/admin/'
<link href="/admin/css/style.css"> 才能被 location /admin/ { alias /var/www/admin/; } 正确命中./ 或 '',浏览器会按相对路径请求,大概率变成 /css/style.css,而该路径可能根本没配置 alias单页应用(SPA)的 JS/CSS 加载没问题,但用户手动刷新子路由(如 /admin/dashboard)时容易 404。用 try_files 回退到入口 HTML:
location /admin/ { alias /var/www/admin/; try_files $uri $uri/ /admin/index.html; }/admin/index.html 是相对于 alias 路径的,即对应 /var/www/admin/index.html
try_files $uri /admin/css/fallback.css;
配置写对只是第一步,还得让 Nginx 真的读得到文件:
www-data 或 nginx 用户)需对目标目录有 r-x 权限;父目录(如 /var/www)至少要有 x(执行)权限才能进入alias /var/www/admin/ 要求该目录已创建,且非空;Nginx 不会自动建目录error_log /var/log/nginx/error.log debug;),看 access 日志中 open() 调用的目标路径是否和你预期完全一致