摘要:nginx服务器的指令alias和root往往被拿出来说,这里简单的区分下他们的用法区别,以防止我们混淆。
alias和root指令是location块下的子指令,他两都是映射请求地址到本地路径用的指令。
alias 和 root 指令在处理请求路径时,有着完全不同的逻辑。一个微小的 / 差异就会导致 Nginx 去寻找一个完全不同的文件路径。
简单说,必须且先用root,有需要再用alias。
当你希望将请求映射到文件系统中一个与 location 名称不完全相同的目录时。使用时务必检查路径末尾的 /。
核心区别
root: 指令会将 请求的 URI 拼接在root指定的路径之后,形成最终的文件路径。alias: 指令会将 配置中location匹配的部分替换为alias指定的路径,形成最终的文件路径。相当于 control + H 的替换。
而且,可以从它们的名字中本身看出区别,alias 就是别名,替换的意思,而root是根的意思,即指定资源的起始位置。
举例说明
假设我们的文件系统结构如下:
/var/www/my-site/
├── static/
│ └── css/
│ └── style.css
└── images/
└── logo.png
我们的目标是:当用户访问 http://example.com/static/css/style.css 时,Nginx 能正确返回 /var/www/my-site/static/css/style.css 文件。
场景 1:使用 root 指令(最常见)
location /static/ {
root /var/www/my-site;
}
工作流程:
- 请求 URI:
/static/css/style.css root规则:root路径 + 请求 URI- 最终文件路径:
/var/www/my-site+/static/css/style.css=/var/www/my-site/static/css/style.css - 结果:成功找到文件。
对于 root,请求的 URI 必须 从 root 指定目录的子目录开始。这里,/static/ 对应着文件系统中的 /var/www/my-site/static/ 目录。
场景 2:使用 alias 指令(并少写一个 /,导致 404)
location /static/ {
alias /var/www/my-site/static;
}
工作流程:
- 请求 URI:
/static/css/style.css alias规则:将匹配到的/static/替换为/var/www/my-site/static- 最终文件路径:
/var/www/my-site/static+css/style.css=/var/www/my-site/staticcss/style.css - 结果:404 Not Found! 因为 Nginx 试图寻找一个名为
staticcss的目录(或文件),而这个目录不存在。
问题根源:
在 alias 路径的末尾,我们少写了一个 /。替换规则变成了:
/static/ -> /var/www/my-site/static
这导致路径拼接时,static 和 css 之间没有分隔符,被直接连在了一起,形成了错误的路径 .../staticcss/...。
场景 3:使用 alias 指令(正确写法)
location /static/ {
alias /var/www/my-site/static/;
}
工作流程:
- 请求 URI:
/static/css/style.css alias规则:将匹配到的/static/替换为/var/www/my-site/static/- 最终文件路径:
/var/www/my-site/static/+css/style.css=/var/www/my-site/static/css/style.css - 结果:成功找到文件。
关键点:
在 alias 路径的末尾加上了 /。替换规则变成了:
/static/ -> /var/www/my-site/static/
这样,替换后的路径以一个 / 结尾,与请求 URI 的剩余部分 css/style.css 能够正确地拼接在一起。
总结与最佳实践
| 指令 | 拼接规则 | 关于 / 的注意事项 |
|---|---|---|
root | root路径 + 请求URI | root 指令末尾的 / 是可选的,通常不加。因为请求 URI 本身就以 / 开头。 |
alias | 将 location 匹配部分替换为 alias 指定路径 | alias 指令末尾的 / 至关重要。必须保证替换后的路径是一个完整的目录路径并以 / 结尾。 |
简单记忆:
- 用
root:简单直观,大部分静态资源服务都用它。 - 用
alias:当你希望将请求映射到文件系统中一个与location名称不完全相同的目录时。使用时务必检查路径末尾的/。
简单说,先用root,再用alias。
所以,“少写一个 / 就可能把目录当成文件去查找”,在 alias 指令上体现得尤为明显。一个看似微不足道的 /,决定了 Nginx 是去寻找一个目录,还是去寻找一个名字奇怪的非预期文件。
系列文章
本文属于Nginx系列,欢迎查看
Nginx的代理原理和使用配置
juejin.cn/post/756916…
Nginx 的崛起:从 C10K 问题到现代 Web 的流量基石
juejin.cn/post/756921…
Nginx的配置不奇怪:从零看懂匹配规则与配置层次
juejin.cn/post/757024…
Nginx配置-alias和root命令辨析
juejin.cn/post/757026…