船说 CMS 采集图片防盗链怎么处理

chinaz
chinaz 初级会员超兽战士
发布于 2026-10-08 05:01 ·1 浏览 ·0 回复

学完这篇,你能让船说 CMS 采集来的外站图片在自家站点正常显示,不再出现一片空白或者红色小叉。

采集图片显示不出来,九成是对方站点开了防盗链:服务器检查请求头里的 Referer,发现不是自己域名,就直接返回 403。下面按「先诊断、再处理、最后兜底」的顺序来。

第一步:确认到底是不是防盗链

这一步要拿到证据,别瞎猜。打开你采集出来的文章页,按 F12 打开开发者工具,切到 Network(网络)面板,刷新页面,在筛选框输入 jpg 或 png。点中失败的图片请求,看两处:Status 状态码是 403 还是 404;Response Headers 里有没有 Referer 这一行。

如果是 403,而且把图片地址直接粘到浏览器地址栏能打开,基本可以确定是防盗链。如果是 404,那是原图被删了,跟防盗链无关。

注意:地址栏直接访问能打开、页面里打不开,这个对比是判断防盗链最可靠的方法。

第二步:开启采集的图片本地化(首选方案)

这一步把远程图片下载到你自己的服务器,从此彻底不受对方防盗链影响。

进入后台 →「采集管理」→「采集规则」,找到你正在用的那条规则,点「编辑」。在「内容处理」标签页里,勾选「图片本地化」或「下载远程图片」(不同版本叫法不同,意思一样),保存。然后进「采集节点管理」,对目标节点执行一次「重新采集」或「更新已有文章」,让规则重新跑一遍。

跑完后图片会落到 /uploads/ 或 /attachment/ 目录下,文章正文里的 src 会替换成本地地址。

注意:本地化依赖服务器的 allow_url_fopen 或 cURL 扩展。如果采集时提示「下载图片失败」,先去 php.ini 确认 extension=curl 没有被注释掉,并把 max_execution_time 从默认 30 调到 300,否则图片一多会中途超时。

第三步:给采集请求加上 Referer 头

如果本地化下载也失败(对方连服务器对服务器的请求都拦),就得让采集器伪装成从对方站点跳转过来的。

在「采集规则」编辑页往下找「高级设置」或「请求头设置」,里面有「自定义 HTTP 头」的输入框,按这个格式填:

Referer: https://对方站点域名/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36

保存后重新采集。有些船说版本这个入口在「采集节点」而不是「采集规则」里,两个地方都翻一下。

注意:Referer 必须带上 https:// 和结尾的斜杠,只写域名常常无效。

第四步:改下载函数,硬编码 Referer

第三步无效时,直接改代码。用 FTP 或宝塔面板的文件管理器,在船说 CMS 根目录下搜 curl_init,通常能在 include/ 或 app/ 里找到图片下载函数。在 curl_exec 之前加两行:

curl_setopt($ch, CURLOPT_REFERER, 'https://对方站点域名/');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)');

保存后到后台「系统」→「缓存管理」清一次缓存,再重新采集。

注意:升级船说 CMS 会覆盖这个文件,升级前先备份改动。

第五步:前端加 no-referrer 兜底

如果图片是前端直接引用外链(没走本地化),可以让你自己的页面在请求图片时不发送 Referer,对方就查不到来源。

编辑模板文件,一般在这几个路径之一:template/模板名/head.html、template/模板名/header.html。在 <head> 里加一行:

<meta name="referrer" content="no-referrer">

或者只对图片生效,在内容模板里把 <img> 改成:

<img src="..." referrerpolicy="no-referrer">

注意:这个 meta 是全局的,会影响统计代码识别来源,介意的话只用 referrerpolicy 单标签方案。

第六步:Nginx 反向代理(对付顽固站点)

前面都搞不定,就在服务器层做图片代理。在宝塔面板打开「网站」→ 你的站点 →「配置文件」,在 server {} 里加:

location /imgproxy/ {
    proxy_pass https://对方站点/;
    proxy_set_header Referer https://对方站点/;
    proxy_set_header User-Agent $http_user_agent;
    proxy_hide_header Set-Cookie;
    expires 7d;
}

保存后重载 Nginx。接着在后台「采集规则」的内容替换里,把对方的图片域名批量替换成 https://你的域名/imgproxy/。

注意:这是把对方流量转到你自己服务器上,只适合小规模使用,量大容易被对方封 IP。

第七步:验证结果

重新采集 3 到 5 篇文章,打开前台页面,F12 → Network 看图片请求是不是全部变成 200,且 src 已经是你的域名。再清一次浏览器缓存刷新,确认不是缓存造成的假象。

小结

  • 先用 F12 看状态码,403 才按防盗链处理,404 是原图没了
  • 最省事的方案是开启采集规则的「图片本地化」,一次配置永久有效
  • 本地化失败时补 Referer 请求头,格式必须带协议和结尾斜杠
  • 代码层可硬编码 CURLOPT_REFERER,但升级会覆盖,要备份
  • 前端 referrerpolicy="no-referrer" 是兜底,Nginx 反代是最后手段
  • 每次改完配置都要清后台缓存 + 重新采集,否则看到的还是旧结果
版权声明:本文来自 GJ站长论坛《船说 CMS 采集图片防盗链怎么处理》
原文链接:https://www.gj0.com/thread-754.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~