在 Nginx 中 alias 与 try_files 联用需注意路径拼接逻辑:alias 替换 location 匹配的 URI 前缀,try_files 路径相对于 alias 目录计算;必须确保 alias 末尾带 /,避免混用 root,fallback 应通过 @named location 实现以防止循环匹配和路径错误。
在 Nginx 中,alias 和 try_files 一起使用时需特别注意路径拼接逻辑,否则容易返回 404。核心原则是:alias 替换的是 location 匹配的 URI 前缀,而 try_files 的路径是相对于 alias 指向的目录计算的。
假设你想把 /static/xxx 映射到磁盘目录 /var/www/assets/,并支持 fallback 到 index.html(用于 SPA 路由):
location /static/ {alias /var/www/assets/;try_files $uri $uri/ /static/index.html;}
注意:
- alias 末尾必须加 /(否则路径拼接会出错);
- try_files 中的 /static/index.html 是相对于 当前 location 的 URI 空间(不是文件系统),Nginx 会再次匹配这个 URI —— 所以要确保有对应 location 处理它,或改用 @fallback。
推荐用 @fallback 避免 URI 重写歧义:
location /static/ {alias /var/www/assets/;try_files $uri $uri/ @static_fallback;}location @static_fallback { alias /var/www/assets/; try_files /index.html =404; }
说明:
- $uri 是请求的原始 URI(如 /static/js/app.js);
- alias 把它映射为 /var/www/assets/js/app.js;
- 若文件不存在,跳转到 @static_fallback;
- @static_fallback 中的 /index.html 会被 alias 解析为 /var/www/assets/index.html。
alias /var/www/assets; 会导致 Nginx 尝试访问 /var/www/assetsstatic/file.txt(路径粘连)try_files /file.js ...,此时 Nginx 会从 root 目录找,而非 alias 目录,失效/var/www/assets/index.html,就别写 /static/index.html(除非你有另一个 location 显式处理它)让 /app/ 下所有请求优先找真实文件,找不到就返回 index.html(保持前端路由):
location /app/ {alias /opt/myapp/dist/;try_files $uri $uri/ @app_fallback;}location @app_fallback { alias /opt/myapp/dist/; try_files /index.html =404; }
这样访问 /app/subpage 时:
- 先查 /opt/myapp/dist/subpage(文件或目录);
- 再查 /opt/myapp/dist/subpage/index.html;
- 最终 fallback 到 /opt/myapp/dist/index.html。