nginx的alias指令是路径替换而非拼接,location与alias结尾斜杠必须一致,否则导致路径粘连或截断;alias值须为真实存在的绝对路径,且权限正确;混用try_files时应使用$request_filename而非$uri。

Nginx 的 alias 指令看似简单,实际出错率很高——绝大多数 404、403 或路径错乱,不是文件没放对,而是拼接逻辑被误解了。核心就一条:alias 是替换,不是拼接;它删掉匹配的 URL 前缀,再把剩下部分贴到你给的路径后面。
location 结尾斜杠和 alias 结尾斜杠必须对齐
这是最常踩的坑。两者斜杠不一致,会导致路径“粘连”或“截断异常”。
✅ 推荐统一写法:
location /static/ { alias /var/www/assets/; }
请求/static/js/app.js→ 实际读取/var/www/assets/js/app.js❌ 错误组合1:
location /static/ { alias /var/www/assets; }(alias 缺/)
请求/static/js/app.js→ 变成/var/www/assetsjs/app.js(自动粘连,少了个/)❌ 错误组合2:
location /static { alias /var/www/assets/; }(location 缺/)
请求/static/js/app.js可能只匹配/static字符串,剩下js/app.js被拼上 →/var/www/assets/js/app.js看似对,但/static/xxx就可能不命中,尤其当有更长前缀时(比如/static-admin/)
小技巧:所有
location以/结尾,所有alias值也以/结尾(除非指向单个文件,如alias /var/www/favicon.ico;)
alias 值必须是容器/系统内真实存在的绝对路径
在 Docker 或非标准部署中,很多人把 alias 写成相对路径、URL 编码路径,或漏掉挂载点。
- ✅ 正确:
alias /app/dist/;(路径存在、权限可读、以/结尾) - ❌ 错误:
alias ./dist/;(相对路径,Nginx 不认) - ❌ 错误:
alias /app%20build/;(URL 编码,系统里根本没有这个目录) - ❌ 错误:
alias "/app/build";(结尾没/,且双引号里空格没处理好)
验证方法:进容器执行
ls -l /app/dist/,确认目录存在;再检查 Nginx worker 用户(如www-data)能否cd进去 —— Linux 下目录必须有x权限才能进入。
alias 和 try_files 混用时别依赖 $uri
try_files $uri =404; 在 alias 块里基本无效,因为 $uri 是原始请求路径(如 /static/main.css),而 alias 已经把它映射到另一位置,Nginx 不会自动用 $uri 去查 alias 后的路径。
✅ 正确写法:
try_files $request_filename =404;$request_filename是 Nginx 内部已根据alias计算出的真实磁盘路径,直接校验是否存在。-
✅ SPA fallback 场景(如
/admin/子应用):location /admin/ { alias /var/www/admin/dist/; try_files $request_filename $request_filename/ /admin/index.html; }
别在正则 location 里随便用 alias
旧版 Nginx(location ~ /xxx/ { alias ... },会直接报错或静默失效。
- ✅ 安全做法:用前缀匹配代替正则,比如
location ^~ /api/ { alias ... } - ✅ 若必须用正则(如版本路由),确保 Nginx ≥ 1.11.5,并显式写出捕获组:
location ~ ^/v(?<ver>\d+\.\d+)/(.*)$ { alias /opt/app/releases/$ver/$2; }</ver>
前端 base 路径和 Nginx location 必须严格一致
Vue Router 的 base: '/admin/'、Vite 的 base: '/admin/'、CRA 的 "homepage": "/admin/",必须和 Nginx 的 location /admin/ 完全匹配——首尾斜杠、大小写、字符一个都不能差。
- ❌
base: '/admin'→ JS 请求/adminjs/chunk.js,404 - ❌
location /Admin/(大写 A)→ 前端请求/admin/xxx匹配不到,回退到 root 规则
不复杂但容易忽略











