root 指令本身不参与防盗链判断,仅负责将请求路径映射到物理文件位置;它必须置于匹配静态资源的 location 块内,与 valid_referers 和 if($invalid_referer) 协同工作,路径拼接需准确,否则导致 404 或防盗链失效。

Nginx 中 root 指令本身不直接参与防盗链判断,但它决定了静态资源的物理路径映射关系。只有当 root(或 alias)与 valid_referers 配合在能命中资源的 location 块内时,防盗链逻辑才能真正生效。关键不是 root 做了什么,而是它让 Nginx 知道“这个请求到底要找哪个文件”,从而支撑后续基于 $invalid_referer 的拦截动作。
root 必须写在匹配资源的 location 里
防盗链规则不能只写在 server 级别或上游配置中。Nginx 需要明确知道:
- 当前请求匹配哪个
location - 这个
location下资源从哪读(靠root或alias定义) - 才能结合
valid_referers判断 Referer 是否合法,并决定是否拦截
如果 root 缺失或位置错误,Nginx 可能找不到文件,返回 404,或者根本跳过防盗链逻辑。
root 路径必须与 location 路径拼接正确
例如:
location /static/ {
root /var/www/html;
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}请求 /static/logo.png → 实际读取 /var/www/html/static/logo.png
这里 root 的值是“根目录”,location 的 /static/ 是“路径前缀”,两者拼接才得到真实文件路径。
⚠️ 注意:不要写成 root /var/www/html/static;,否则请求 /static/logo.png 会去找 /var/www/html/static/static/logo.png —— 多了一层 static,导致 404。
推荐搭配方式:用前缀匹配 + 明确 root
- 优先选
location ^~ /static/而非正则,避免优先级干扰 -
root值保持简洁,指向站点根目录(如/var/www/html),让路径拼接清晰可预期 - 若资源集中在子目录(如
/images/),也可单独配一个 location:location /images/ { root /var/www/assets; valid_referers none blocked example.com; if ($invalid_referer) { return 403; } }请求
/images/icon.svg→/var/www/assets/images/icon.svg
不要用 root 做“隐藏路径”来绕过防盗链
有人误以为把图片放在非公开路径、再用 root 指向那里就能防盗,其实不行。只要 URL 可访问、location 可匹配、root 可定位,防盗链就依赖 valid_referers + if 组合,和 root 的具体值无关。root 只负责“找到文件”,不负责“决定能否访问”。
小结关键点
-
root是防盗链生效的前提条件之一,不是执行者 - 它必须出现在匹配静态资源的 location 块内
- 路径拼接要自然,避免多级嵌套导致文件找不到
- 和
valid_referers、if ($invalid_referer)是一套协作逻辑,缺一不可
不复杂但容易忽略


















