nginx可通过valid_referers指令配合$invalid_referer变量实现图片防盗链,支持域名白名单、空referer和正则匹配,再用if判断返回403或降级图,需注意作用域一致、https引用清referer等问题。

可以通过 Nginx 的 valid_referers 指令配合内置变量 $invalid_referer,精准识别非授权来源的图片请求,并直接返回 403 或替换为降级图(如“禁止盗链”提示图)。
配置 valid_referers 定义合法来源
在 server 或 location 块中设置允许的 referer,Nginx 会自动将结果写入 $invalid_referer 变量(值为 1 表示非法,0 表示合法):
- 支持域名白名单:
valid_referers domain.com *.example.org; - 支持空 referer(直接访问或某些客户端):
valid_referers none; - 支持正则匹配:
valid_referers ~\.google\. /blog/; - 注意:多个条件是“或”关系,满足任一即视为合法
用 if 判断 $invalid_referer 并拦截
对静态资源(如 .jpg、.png、.webp)location 块内添加判断逻辑:
- 直接返回 403:
if ($invalid_referer) { return 403; } - 返回降级图(需提前准备一张本地图):
if ($invalid_referer) { rewrite ^/.*\.(jpg|jpeg|png|webp)$ /assets/banned.png break; } - 推荐用
rewrite ... break而非redirect,避免暴露真实路径且保持 HTTP 状态为 200
注意事项与常见避坑点
$invalid_referer 是只读变量,不能赋值;它的值仅由 valid_referers 指令触发计算,必须确保该指令已声明:
- 若 location 中没写
valid_referers,$invalid_referer恒为 1,所有请求都被误判为盗链 - HTTPS 页面引用 HTTP 图片时,浏览器可能清空 referer,需显式加
none允许 - 移动端 WebView、部分小程序或测试工具可能不带 referer,建议结合日志观察真实流量再收紧策略
- 不建议对整个 server 块统一设
valid_referers,应按资源类型(如 /images/)精细化控制
验证是否生效
部署后可用 curl 模拟盗链请求测试:
- 正常请求(带合法 referer):
curl -H "Referer: https://your-site.com" https://yoursite.com/photo.jpg - 盗链请求(伪造 referer):
curl -H "Referer: https://evil.com" https://yoursite.com/photo.jpg→ 应得 403 或降级图 - 无 referer 请求:
curl -H "Referer:" https://yoursite.com/photo.jpg→ 根据是否含none决定是否放行
不复杂但容易忽略细节,关键是 valid_referers 和 $invalid_referer 必须配套使用,且作用域要准确。











