海洋 CMS 图片防盗链怎么配置防止盗图
结论:海洋 CMS 里显示的图片是静态文件,由 Nginx 或 Apache 直接返回给浏览器,PHP 程序不参与这次请求,所以在后台找不到"图片防盗链"开关是正常的。防盗链必须在 Web 服务器层或 CDN 层配置,核心做法只有一个:校验 HTTP 请求头里的 Referer,不在白名单里的域名请求图片时返回 403 或 302 跳到一张占位图。
图片防盗链的原理是什么?
结论:防盗链就是检查请求图片时浏览器带过来的 Referer(来源页地址)字段,只有来源页是自家域名的请求才放行。
当别人在自己的网站上写 <img src="https://你的域名/uploads/2026/01/abc.jpg"> 时,访客的浏览器请求这张图会带上 Referer: https://别人的域名/。服务器一看这个来源不是你的域名,就拒绝返回图片内容,对方页面就显示一张破图或你指定的占位图。
需要先确认你的图片目录。海洋 CMS 上传的图片通常放在站点根目录的 uploads 下并按月份分子目录,例如 https://你的域名/uploads/2026/01/abc.jpg。打开任意一篇文章,右键查看封面图的地址,把 URL 中域名后面的路径前缀记下来,这就是后面要写进配置的匹配规则。
Nginx 下怎么配海洋 CMS 图片防盗链?
结论:在站点的 server {} 块里加一段针对图片后缀的 location,用 valid_referers 声明白名单,5 分钟就能改完。
location ~* ^/uploads/.*\.(jpe?g|png|gif|webp|bmp)$ {
valid_referers none blocked server_names
*.yourdomain.com yourdomain.com
m.yourdomain.com img.yourdomain.com;
if ($invalid_referer) {
# 二选一:返回 403,或跳到占位图
# return 403;
return 302 https://www.yourdomain.com/static/nohotlink.png;
}
expires 30d;
add_header Cache-Control "public";
}
参数含义:none 放行没有 Referer 的请求,blocked 放行 Referer 被代理或防火墙抹掉的请求,server_names 放行本 server 块里 server_name 声明的域名,后面的域名就是额外白名单,支持 *.yourdomain.com 这种通配。
注意点有三个。第一,location 的匹配顺序是正则按文件出现顺序,如果你原来已经有一条 location ~ .*\.(gif|jpg|png)$ 的缓存规则,这条新的必须写在它上面,否则不生效。第二,改完必须 nginx -t 检查语法再 nginx -s reload,配置写错会导致整站 502。第三,如果全站走 HTTPS,白名单里的域名不要写成 http://。
Apache 服务器怎么配?
结论:用 .htaccess 写两条 RewriteCond 排除自家域名和空 Referer,非法来源直接 403。
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.|m\.)?yourdomain\.com/ [NC]
RewriteRule \.(jpe?g|png|gif|webp|bmp)$ - [F,NC]
想把 403 换成占位图,把最后一行改成 RewriteRule \.(jpe?g|png|gif|webp|bmp)$ /static/nohotlink.png [R=302,L,NC]。前提是主机开启了 mod_rewrite,虚拟主机用户可以在 .htaccess 里直接改,独立服务器改完要重启 Apache。
空 Referer 该不该放行?
结论:建议放行。禁掉空 Referer 会连带打掉图片收录、微信分享卡片和用户直接打开图片这三类正常场景。
搜索引擎图片爬虫抓图时多数不带 Referer 或带自身域名,一旦禁空,你在百度图片里的收录会明显掉。微信、QQ 内置浏览器里页面内图片带的是页面自身 URL(同域,能过白名单),但分享卡片的缩略图抓取走的是空 Referer 路径,禁掉就会出现"分享出去没图"。
如果确实要收紧,可以保留 none 但叠加 User-Agent 放行爬虫,把搜索引擎单独捞出来。除非你的图片是高价值商业素材,否则不建议走这条路,维护成本高于收益。
用了 CDN 或对象存储怎么配?
结论:图片走 OSS、COS、七牛这类存储时,防盗链在控制台的"防盗链"或"安全设置"里开,不用改服务器配置。
阿里云 OSS、腾讯云 COS、七牛云都提供 Referer 防盗链,支持白名单/黑名单模式、通配符域名,并且都有一个"是否允许空 Referer"的勾选项,按上一节的建议勾上。配好白名单后记得把 CDN 域名本身也加进去,否则回源会被自己拦掉。
怎么验证配置真的生效了?
结论:用 curl 带不同 Referer 请求同一张图,看返回码是不是 403/302,这是最直接的验证方式。
# 伪造外部来源,应返回 403 或 302
curl -I -H "Referer: https://www.other.com/" https://你的域名/uploads/2026/01/abc.jpg
# 本站来源,应返回 200
curl -I -H "Referer: https://你的域名/post/1.html" https://你的域名/uploads/2026/01/abc.jpg
# 不带 Referer,若放行了 none 应返回 200
curl -I https://你的域名/uploads/2026/01/abc.jpg
最后提醒一句边界:Referer 是可以伪造的,curl -e "https://你的域名/" 就能骗过校验,所以防盗链挡的是"普通站长直接引用图片地址"这类低成本盗用,挡不住先下载再上传的搬运。真要保护图片,水印和限制大图权限比防盗链更有效。
原文链接:https://www.gj0.com/thread-906.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。