alias 指令完全替换 location 前缀而非拼接,是区别于 root 的核心特性;需严格匹配斜杠逻辑,支持正则捕获动态映射,须防范路径遍历并配合 try_files 实现目录索引。

nginx 的 alias 指令用于将某个 location 路径映射到文件系统中一个**非根目录**的实际路径,和 root 有本质区别:它会**完全替换**匹配的 location 前缀,而不是拼接。写对 alias 是避免 404、权限错误或路径越界的前提。
alias 和 root 的核心区别必须搞清
这是最容易出错的地方:
-
root /var/www;+location /static/ { ... }→ 请求/static/css/app.css对应磁盘路径/var/www/static/css/app.css(自动拼接) -
alias /var/www/assets/;+location /static/ { ... }→ 请求/static/css/app.css对应磁盘路径/var/www/assets/css/app.css(去掉 /static/ 后拼 alias 路径)
⚠️ 关键规则:alias 后的路径结尾是否带斜杠,不影响行为;但 location 的末尾斜杠必须和 alias 路径逻辑一致,否则可能多出或少掉一级目录。
带变量和正则的 alias 高级写法
当需要动态映射(如多租户、版本化资源),可结合 location ~ 和捕获组:
- 按子域名映射不同静态资源目录:
location ~ ^/assets/(?<ver>v\d+\.\d+\.\d+)/(.+)$ {<br> alias /opt/app/releases/$ver/static/$2;<br>}</ver>
请求/assets/v2.1.0/js/main.js→ 映射到/opt/app/releases/v2.1.0/static/js/main.js - 用 $1 捕获路径段并重定向到对应磁盘结构:
location ~ ^/media/(.+\.(?:jpg|png|gif))$ {<br> alias /data/uploads/$1;<br>}
注意:这里$1已包含完整文件名(含扩展名),所以 alias 路径里直接用,不额外加前缀
安全与路径控制的关键细节
alias 不做路径规范化,容易引发越界访问(如 ../):
- 务必配合
internal;限制仅内部跳转(如配合try_files或error_page) - 禁用路径遍历:在 alias 前加
rewrite ^(/[^/]+)+/(\.\.)+ / break;或用if ($request_uri ~ "\.\.") { return 403; }(不推荐 if,但简单场景可用) - 确保 alias 目录权限正确:
nginx用户需有读取权限,且目录不能是符号链接(除非启用disable_symlinks off;并明确指定 safe directory)
常见组合:alias + try_files + index
想让 alias 目录支持自动找 index.html?alias 本身不支持 index 指令,必须靠 try_files 曲线救国:
-
location /docs/ {<br> alias /var/www/docs/;<br> try_files $uri $uri/ /docs/index.html;<br>}
访问/docs/→ 尝试找/var/www/docs/index.html;访问/docs/api/→ 找/var/www/docs/api/index.html - 注意:
$uri/会触发内部重定向,所以/docs/api/最终由location /docs/再次匹配,再走一次 try_files











