使用 valid_referers 配合 $invalid_referer 实现防盗链,需将规则置于静态资源 location 块中,白名单覆盖 none、blocked 及主子域,匹配后 return 403 或 error_page 403,配合 curl 验证各类 referer 场景。

直接用 valid_referers 配合 $invalid_referer 变量就能实现,关键不是堆参数,而是把规则写对位置、留好兼容项、明确响应动作。
白名单必须覆盖真实访问场景
合法 Referer 类型不止是“来自你家网站”,还有不少容易被忽略的正常情况:
- none:用户直接在浏览器地址栏输入图片链接、收藏夹打开、HTTPS 页面跳转到 HTTP 资源时,Referer 会被清空
- blocked:某些隐私插件、企业防火墙或代理会把 Referer 改成空字符串或只留路径,这类请求也应放行
- 主域和子域分开写:
example.com不匹配www.example.com,得都列上,或统一用*.example.com(注意它不包含主域) - 正则要锚定结尾并转义点号:
~\.baidu\.(com|cn)$比~baidu更安全,避免误匹配
配置必须放在静态资源 location 块里
不能写在 http 或 server 级别——valid_referers 只在能定位到文件的上下文中生效。推荐两种匹配方式:
- 按后缀匹配(通用):
location ~* \.(jpg|jpeg|png|gif|css|js|woff2|ttf|svg|mp4)$ - 按路径前缀匹配(适合集中存放):
location ^~ /static/或location /assets/
同时确保该 location 内有 root 或 alias 指向实际文件路径,否则 Nginx 找不到资源,防盗链也就无从谈起。
拦截动作要语义清晰、日志可查
推荐优先用 return 403,而不是 rewrite 跳转:
-
return 403状态码明确,CDN、爬虫、监控系统都能正确识别;日志中$status和$invalid_referer一目了然 - 若需展示友好提示图,改用
error_page 403 =200 /images/forbidden.png;,既保持拒绝语义,又返回自定义内容 - 避免在同一个 location 中混用多个
if或嵌套rewrite,易引发重写循环或路径错乱
别忘了验证和边界测试
配置 reload 后,用 curl 快速验证几种典型场景:
- 合法来源:
curl -H "Referer: https://example.com/page.html" https://example.com/logo.png→ 应返回 200 - 盗链来源:
curl -H "Referer: https://evil-site.net" https://example.com/logo.png→ 应返回 403 - 空 Referer:
curl https://example.com/logo.png→ 若含none,应返回 200 - 被屏蔽的 Referer:
curl -H "Referer: localhost" https://example.com/logo.png→ 若含blocked,应返回 200
Referer 可伪造,所以这只是基础防护层。高敏感资源建议叠加 secure_link 或由后端鉴权 + X-Accel-Redirect 控制。











