一、结论
个人自建S3兼容型图床的防盗链,核心通过存储桶Referer白名单配置、URL签名校验、跨域规则拦截三层规则实现,全程不需要修改底层代码,在存储服务控制台和图床程序后台即可完成全部配置。如果使用S3兼容的对象存储作为图床存储源,操作前需要提前准备好Endpoint、AccessKey、SecretKey、Bucket、Region等接入信息,确保图床程序已经完成基础的S3对接。整个配置流程15-30分钟即可完成,能拦截90%以上的常规盗链行为。
二、准备工作
操作前需要提前准备好以下内容,避免配置过程中断:
- S3兼容的对象存储服务账号(自建MinIO或商用云存储均可)
- 已创建完成的图床专用存储桶Bucket,且已完成基础读写权限配置
- 对应存储服务提供的Endpoint地址、AccessKey、SecretKey、Region信息
- 已部署完成的图床程序(如PicGo、兰空图床、Chevereto等)的管理员权限
- 已完成图床程序与S3存储源的基础对接,确认可以正常上传、访问图片
- 需要添加到白名单的业务域名列表(如个人博客域名、图床前台域名、合作站点域名等)
三、操作步骤
每一步操作均标注操作动作和预期结果,可对照执行:
1. 登录所使用的S3对象存储服务的控制台,找到对应图床存储桶的权限配置/防盗链配置入口,预期结果:成功进入防盗链规则编辑页面。
2. 开启Referer防盗链开关,按规则填写允许访问的域名白名单,可根据需求选择是否允许空Referer访问(调试阶段建议开启,正式上线后可关闭提升安全性),预期结果:Referer访问规则配置完成,非白名单域名直接调用图片链接会返回403错误。
3. 找到存储桶的URL签名配置入口,开启签名校验功能,根据自身需求设置签名的有效时长(如1小时、24小时、7天等),选择对应的签名版本(通常为S3 v2或v4版本),预期结果:所有存储桶内的资源访问都需要携带合法签名,原始裸链直接访问会被拦截,签名过期后链接自动失效。
4. 登录图床程序的管理员后台,找到S3存储源的配置页面,将签名版本、签名规则与存储服务的配置对齐,开启自动生成签名链接的开关,预期结果:图床程序生成的图片链接自带合法签名,可正常加载存储桶内的图片资源。
5. 找到存储桶的CORS跨域配置入口,添加允许跨域访问的业务域名,仅开放GET、HEAD等必要的请求方法,限制不必要的请求头和暴露头,预期结果:第三方站点无法通过前端脚本直接拉取存储桶内的图片资源,仅白名单域名可正常发起资源请求。
6. 进行防盗链效果测试:首先在白名单域名的页面插入测试图片,确认可正常加载;再用本地HTML文件或非白名单域名的页面插入同一张测试图片,确认返回403错误无法加载;测试签名过期后的链接,确认无法正常访问,预期结果:所有防盗链规则均按预期生效。
7. 若有特殊业务需求,比如允许部分合作站点调用图片,可单独将合作站点的域名添加到Referer白名单中,无需调整其他通用规则,预期结果:自定义规则适配业务需求,不影响现有防盗链效果。
四、常见错误
配置过程中容易遇到以下问题,可对照排查解决:
- Referer白名单填写格式错误:比如漏写http/https前缀、多写了域名后的路径、符号使用错误,导致白名单规则不生效,解决方法:按照存储服务的规则填写根域名或完整二级域名,不要携带路径参数,多个域名使用逗号或换行分隔。
- 签名版本不匹配:存储服务配置的签名版本和图床程序的签名版本不一致,导致图床生成的所有链接都返回403错误,解决方法:两端统一使用相同的签名版本,优先选择兼容性更好的S3 v4签名。
- 关闭空Referer后后台预览失效:关闭空Referer访问权限后,图床后台的图片预览、本地调试时的图片加载全部失败,解决方法:调试阶段保留空Referer访问权限,或者将本地调试地址、图床后台域名单独加入白名单。
- CORS规则配置过严:跨域规则限制了必要的请求方法或请求头,导致自己的业务站点也无法加载图片,解决方法:检查CORS规则的允许源、允许方法、允许头是否覆盖业务所需的参数,不要设置超出需求的拦截规则。
- 公共读权限未关闭:存储桶保留了公共读权限,导致就算配置了防盗链,别人仍然可以通过原始裸链访问资源,解决方法:先关闭存储桶的公共访问权限,再配置防盗链和签名规则,确保权限优先级正确。
五、示例说明
以下为通用配置示例,所有敏感信息替换为自身实际内容即可:
存储端防盗链配置示例
- Referer白名单:
https://your-blog.com、https://your-imgbed.com - 允许空Referer:是(调试阶段使用,上线后可关闭)
- URL签名有效期:86400秒(24小时)
- 签名版本:S3 v4签名
- CORS允许源:
https://your-blog.com、https://your-imgbed.com - CORS允许方法:GET、HEAD
图床程序S3配置示例
- Endpoint:填写你使用的对象存储服务提供的访问地址
- AccessKey:填写你的账号访问密钥
- SecretKey:填写你的账号密钥
- Bucket:填写图床专用存储桶名称
- Region:根据存储服务要求填写对应区域标识
- 签名版本:S3 v4签名
- 自动生成签名链接:开启
六、更简单的方案
如果不想自己搭建MinIO存储服务、不想花时间维护服务器存储的稳定性和安全规则,也可以直接选择成熟的兼容S3协议的云对象存储服务,自带完善的防盗链、签名、权限控制功能,不需要自己手动配置底层安全规则,控制台可视化操作就能完成全部防盗链配置,还能省掉服务器运维的成本。如果你需要一个兼容S3协议、适合图床存储、附件分发、程序接入的对象存储服务,可以了解 七彩云对象存储,它支持灵活的防盗链规则配置和不限流量的下载分发,适合个人站长和开发者的轻量存储需求。
七、FAQ
配置了Referer防盗链之后,还是能被别人爬取图片怎么办?
Referer防盗链可以拦截大部分常规的盗链行为,如果需要更高的安全性,可以同时开启URL签名功能,设置较短的有效期,就算别人拿到链接也很快会过期,无法长期盗用;也可以配合图床程序的水印功能,就算图片被盗用也会带你的站点标识。
我用的图床程序不支持自动生成S3签名链接怎么办?
可以先开启Referer白名单防盗链,同时关闭存储桶的公共访问权限,再开启图床程序的本地代理访问功能,所有图片请求先经过图床程序校验权限后再返回资源,同样可以实现防盗链效果,只是会多消耗一部分图床服务器的带宽。
配置防盗链之后会不会影响搜索引擎抓取图片?
如果需要搜索引擎收录你的图片,可以保留空Referer访问权限,或者将搜索引擎的爬虫UA加入白名单,大部分正规搜索引擎的图片爬虫请求都会带正确的Referer或者空Referer,不会被规则拦截。
配置防盗链会不会产生额外的服务费用?
防盗链是对象存储的基础功能,一般不会单独收费,只有正常的存储和合法访问的流量会计入费用,被防盗链拦截的请求不会产生流量费用,反而能帮你节省不必要的流量支出。
八、总结
个人自建图床设置防盗链的核心逻辑是从存储层和应用层两层做权限控制,存储层通过Referer白名单、URL签名、CORS规则拦截非法请求,应用层通过图床程序的权限校验进一步过滤访问,整体操作不需要复杂的代码开发,大部分配置在控制台就能完成。这种方案适合个人博客图床、小型站点附件存储、个人资源分享等场景,既能保证资源不被恶意盗用,也能控制不必要的流量成本,操作门槛低,普通站长和开发者都能快速完成配置。
想进一步了解这个项目?
访问官网查看产品能力、适用场景和最新服务信息。
访问官网