Nginx 中 server 与 location 里的 root 区别及使用场景
- 一:背景
- 二:`root` 的作用
-
- 1)`server` 块里的 `root`
- 2)`location` 块里的 `root`
- 三:实际使用场景
- 五:`root` VS `alias`
- 总结
一:背景
在使用 Nginx 做静态资源托管或反向代理时,经常会用到 root 指令。 但很多人第一次配置时会疑惑:
为什么我在 server 里定义了 root,还可以在 location 里再写一个?它们有什么区别?
本文就来详细解释两者的作用范围、优先级,以及一个实际的使用场景。
二:root 的作用
root 的作用是指定资源的根目录,用于将客户端请求的 URI 转换为服务器文件系统的绝对路径。
转换公式:实际路径 = root目录 + URI
1)server 块里的 root
-
作用范围:当前 server 块内的所有 location(除非被覆盖)。
-
特点:充当默认根目录,当 location 里没有单独设置 root 时会继承它。
示例
server {
listen 80;
server_name bird.cn;
root /opt/module/bird;
location / {
index index.html;
}
}
访问
http://bird.cn/index.html
匹配过程
URI: /index.html
root: /opt/module/bird
实际路径: /opt/module/bird/index.html
2)location 块里的 root
-
作用范围:只在当前 location 内生效。
-
特点:会覆盖 server 里的 root 设置。
-
注:它会将 location 匹配到的 URI 完整拼接到 root 目录后面。
示例
location /images/ {
root /data/static;
}
访问
2025-08-16qixkudyttoo.jpg
匹配过程
URI: /images/cat.jpg
root: /data/static
实际路径: /data/static/images/cat.jpg
三:实际使用场景
场景:静态资源分不同目录存放
- 假设目录结构:/opt/module/bird/ # 网站首页文件
/data/static/images/ # 图片资源>
/data/static/videos/ # 视频资源 - 需求:访问首页 → /opt/module/bird/index.html
访问 /images/ → /data/static/images/
访问 /videos/ → /data/static/videos/
配置
server {
listen 80;
server_name bird.cn;
# 默认根目录
root /opt/module/bird;
location / {
index index.html;
}
location /images/ {
root /data/static;
}
location /videos/ {
root /data/static;
}
}
访问结果
http://bird.cn/ → /opt/module/bird/index.html
2025-08-16qixkudyttoo.jpg → /data/static/images/cat.jpg
http://bird.cn/videos/movie.mp4 → /data/static/videos/movie.mp4
五:root VS alias
-
root 会将 location 匹配到的 URI 部分 也拼接到目录路径中。
-
如果不希望拼接匹配部分,而是直接替换成另一个目录,请用 alias。
示例:
location /images/ {
alias /data/static/;
}
访问 /images/cat.jpg 时:
实际路径: /data/static/cat.jpg
而不是 /data/static/images/cat.jpg。
总结
-
server 里的 root:默认根目录,作用于所有未单独设置 root 的 location。
-
location 里的 root:覆盖 server 里的 root,仅在当前 location 生效。
-
拼接规则:root 会拼接匹配到的 URI 片段,alias 不会。
📌 记住一句话:
想按目录分类资源,用 location + root;想直接替换目录,用 alias。
评论前必须登录!
注册