Nginx配置-alias和root命令辨析

156 阅读4分钟

摘要:nginx服务器的指令alias和root往往被拿出来说,这里简单的区分下他们的用法区别,以防止我们混淆。


alias和root指令是location块下的子指令,他两都是映射请求地址到本地路径用的指令。

aliasroot 指令在处理请求路径时,有着完全不同的逻辑。一个微小的 / 差异就会导致 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;
}

工作流程:

  1. 请求 URI: /static/css/style.css
  2. root 规则:root 路径 + 请求 URI
  3. 最终文件路径:/var/www/my-site + /static/css/style.css = /var/www/my-site/static/css/style.css
  4. 结果:成功找到文件。

对于 root,请求的 URI 必须 root 指定目录的子目录开始。这里,/static/ 对应着文件系统中的 /var/www/my-site/static/ 目录。


场景 2:使用 alias 指令(并少写一个 /,导致 404)
location /static/ {
    alias /var/www/my-site/static;
}

工作流程:

  1. 请求 URI: /static/css/style.css
  2. alias 规则:将匹配到的 /static/ 替换为 /var/www/my-site/static
  3. 最终文件路径:/var/www/my-site/static + css/style.css = /var/www/my-site/staticcss/style.css
  4. 结果:404 Not Found! 因为 Nginx 试图寻找一个名为 staticcss 的目录(或文件),而这个目录不存在。

问题根源:alias 路径的末尾,我们少写了一个 /。替换规则变成了: /static/ -> /var/www/my-site/static

这导致路径拼接时,staticcss 之间没有分隔符,被直接连在了一起,形成了错误的路径 .../staticcss/...


场景 3:使用 alias 指令(正确写法)
location /static/ {
    alias /var/www/my-site/static/;
}

工作流程:

  1. 请求 URI: /static/css/style.css
  2. alias 规则:将匹配到的 /static/ 替换为 /var/www/my-site/static/
  3. 最终文件路径:/var/www/my-site/static/ + css/style.css = /var/www/my-site/static/css/style.css
  4. 结果:成功找到文件。

关键点:alias 路径的末尾加上了 /。替换规则变成了: /static/ -> /var/www/my-site/static/

这样,替换后的路径以一个 / 结尾,与请求 URI 的剩余部分 css/style.css 能够正确地拼接在一起。


总结与最佳实践

指令拼接规则关于 / 的注意事项
rootroot路径 + 请求URIroot 指令末尾的 / 是可选的,通常不加。因为请求 URI 本身就以 / 开头。
aliaslocation 匹配部分替换为 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…