Nginx防盗链按location块作用域和路径匹配规则生效,非目录层级结构;valid_referers仅在server或location块内有效,须配合if与return 403使用,并包含none和blocked。

防盗链配置不按“目录层级结构”生效,而是按 资源路径匹配规则 和 location 块作用域 来控制。Nginx 本身没有“防盗链目录树”概念,所谓“层级”,实际是你在 location 中如何定义匹配范围——它决定哪些请求受 Referer 检查约束。
核心原则:location 是防盗链的生效边界
valid_referers 指令只能写在 server 或 location 块内,且只对当前块内匹配到的请求起作用。写在 http 块顶层完全无效(Nginx 不报错,但逻辑失效)。
- 想保护
/images/下所有图片?用location /images/ { ... }或更精准的正则 - 想保护整个静态资源目录(如
/static/)?用location /static/ { ... } - 想按文件类型保护(推荐)?用
location ~* \.(jpg|png|pdf|mp4)$ { ... }
常见层级写法与适用场景
以下写法都需嵌套 valid_referers + if + return 403,且必须包含 none 和 blocked:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
location /images/ { valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; } }
→ 保护所有以/images/开头的路径,包括/images/logo.png、/images/icons/arrow.svg,但不保护/assets/logo.png -
location ^~ /static/ { ... }
→ 使用^~前缀匹配,优先于正则,适合明确前缀路径;避免被后续location ~ \.php$等规则意外覆盖 -
location ~* ^/uploads/.*\.(jpg|jpeg|png|gif)$ { ... }
→ 精准锁定上传目录下的特定图片类型,兼顾路径和扩展名
必须避开的层级陷阱
错误不是出在“层级深不深”,而是出在 匹配范围过宽或过窄:
- 在
location / { ... }里配 valid_referers → 所有请求(HTML、JS、API、登录页)都受 Referer 限制,导致 AJAX 失败、跳转 403、前端路由白屏 - 用
location / { ... }却只匹配图片 → 实际无效,因为/匹配所有路径,但 valid_referers 不会自动过滤文件类型 - 把防盗链写在
location = /favicon.ico里 → 只对 favicon 生效,其他资源完全不受控
推荐的生产级分层结构
不追求“目录树整齐”,而追求“按需隔离”。典型配置如下:
location ~* \.(jpg|jpeg|png|webp|gif|bmp|svg|mp4|avi|pdf|zip|rar)$ { valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; } }location /api/ { # 不加防盗链,API 请求通常无 Referer 或不可靠,靠 token/auth 控制 }location / { # 主页面入口,允许任意 Referer,由前端逻辑控制访问 }
这种结构按资源语义分层,比按物理目录更稳定、更易维护,也避免误伤合法流量。

















