🔒 Nginx 实现图片防盗链(基于 Referer)
Nginx 支持使用 $invalid_referer
变量 + ngx_http_referer_module
模块实现图片防盗链功能,防止他人通过外链引用你的图片资源,从而浪费带宽和服务器资源。
🧩 防盗链实现方式概览
实现方式 | 原理 | 适用场景 |
---|---|---|
Referer 校验 | 校验访问资源时 header 中的 referer 来源 | 通用 + 简单配置 |
签名 URL | 为资源请求生成签名参数,校验签名合法性 | 更高级、API防盗场景 |
本文聚焦于轻量级的 Referer 校验方式。
🚀 开启 Referer 防盗链功能
Referer 防盗链依赖模块:ngx_http_referer_module
(大多数官方编译版本已内置)
支持配置范围:server
、location
块中
✅ 配置示例(按文件扩展名过滤)
下面示例仅允许 xxx.cn / *.xxx.cn 网站引用本服务器的图片资源:
server {
listen 80;
server_name yourdomain.cn;
root /usr/share/nginx/html;
location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked xxx.cn *.xxx.cn;
if ($invalid_referer) {
return 403;
}
}
}
关键解释:
valid_referers none blocked xxx.cn *.xxx.cn
:- 表示允许 referer 是空(none)、被屏蔽(blocked)、或来自 white-list 域名(xxx.cn)。
- 如果你想严格控制,移除
none blocked
(建议做法)。
🔧 简洁示例(针对路径)
如果你把静态资源统一暴露在 /static 路径下,也可以使用如下配置:
location /static {
valid_referers *.xxx.cn;
if ($invalid_referer) {
return 403;
}
alias /static; # 实际静态文件目录
}
⚠️ 注意:alias 需要与 ‘/static’ 目录结构对应,不能误指。
📌 指令说明:valid_referers
参数 | 说明 | 是否推荐 |
---|---|---|
none | 允许没有 Referer 头的请求(如浏览器直接输入 URL、某些编程请求) | ❌ 不推荐 |
blocked | 允许 Referer 存在但被中间设备清除(如某些代理) | ❌ 不推荐 |
域名 | 明确指定允许使用资源的来源,支持通配符,如 *.example.com |
✅ 推荐 |
若不包含 none / blocked,则表示:
只有明确 Referer 且来源于你配置的域名,才能访问目标资源,任何其他都被视为 $invalid_referer = true
🧠 实战建议
移除 none 和 blocked,增强防盗链强度
若你需要兼容早期浏览器、内网等客户端,可适当保留 none
推荐统一使用相对路径指向资源,例如:
<img src="/static/img/logo.png">
不建议信任 Referer 来做强安全限制,Referer 可被轻易伪造,仅用于普通防盗链、轻量保护场景
🚫 防盗链生效但仍被绕过的常见原因
问题 | 常见原因说明 |
---|---|
浏览器能加载但还是浪费流量? | 用户已从合法站点点击,Referer 是合法页面 |
Referer 不生效 | 某些客户端会清除/篡改 Referer |
某些 CDN 节点绕过防盗链? | CDN 可能请求时使用自身域名或更换 Referer |
✅ 总结
- Referer 防盗链是 Nginx 提供的一种轻量防盗策略
- 配置中的
valid_referers
是关键,白名单应精确合理 - 强安全防盗需求场景(如付费下载)建议引入「时间戳 + 签名」URL 验证机制(或基于 JWT 授权)
📚 拓展阅读:
- 官方模块文档:https://nginx.org/en/docs/http/ngx_http_referer_module.html
- 实用进阶:基于 token 的 URL 鉴权、OSS 自定义防盗策略等
作者:freed 创建时间:2025-03-28 14:40
最后编辑:freed 更新时间:2025-03-28 14:40
最后编辑:freed 更新时间:2025-03-28 14:40