当前位置:网站首页 >  攻略

帝国CMS远程图片抓取失败全场景排查与实操修复详细指南

时间:2026年06月02日 14:51:44 来源:易频IT社区

适用版本与前置准备

本指南适配帝国CMS7.0/7.2/7.5所有正式版本,操作前请先备份网站根目录下/e/class/connect.php/e/class/functions.php两个核心文件,避免操作失误导致网站异常。

场景1:PHP配置限制导致抓取失败

问题排查方法

远程抓取依赖PHP的allow_url_fopen配置与curl扩展,先做以下检查:

  • 新建phpinfo.php文件上传到网站根目录,完整代码如下: ``` ```
  • 访问https://你的域名/phpinfo.php,搜索allow_url_fopen确认值为On;搜索curl确认扩展已启用

修复方法

  • 虚拟主机:登录主机控制面板找到PHP配置项,开启allow_url_fopen与curl扩展后保存即可
  • 宝塔面板:进入【软件商店】-【已安装】-找到对应PHP版本-【设置】-【常用扩展】勾选curl,【配置修改】搜索allow_url_fopen设置为On,保存后重启PHP
  • 非面板环境:编辑php.ini文件,找到allow_url_fopen = Off修改为allow_url_fopen = On,找到;extension=curl去掉前面的分号注释,保存后重启PHP-FPM/Apache服务

操作完成后务必删除根目录下的phpinfo.php文件,避免泄露服务器配置信息。

场景2:帝国CMS核心配置错误导致抓取失败

问题排查方法

登录帝国CMS后台,进入【系统】-【系统设置】-【系统参数设置】-【文件设置】,检查以下两项:

  • 是否开启远程保存图片:确认值为
  • 远程保存图片扩展名:确认包含你需要抓取的图片格式,默认值为jpg|jpeg|gif|png|webp,缺失的格式手动添加即可

修复方法

配置错误修改后保存即可,若配置正常仍抓取失败,替换兼容版下载函数:打开/e/class/connect.php文件,搜索get_httpfile函数,将函数整体替换为以下兼容版本:

``` function get_httpfile($url,$location=0,$usecookie=0,$addheader='',$proxy='',$proxyport='') { $url = trim($url); if(!stristr($url,'http://') && !stristr($url,'https://')) { $url = 'http://'.$url; } // 优先使用curl抓取 if(function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); if($usecookie) { curl_setopt($ch, CURLOPT_COOKIEFILE, ECMS_PATH.'e/data/tmp/cookie/'.md5(getip()).'.cookie'); } if($proxy) { curl_setopt($ch, CURLOPT_PROXY, $proxy); curl_setopt($ch, CURLOPT_PROXYPORT, $proxyport); } if(!empty($addheader)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $addheader); } $data = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if($code == 200 || $code == 304) { return $data; } } // 兼容fopen模式 if(ini_get('allow_url_fopen')) { $opts = array( 'http' => array( 'method' => 'GET', 'timeout' => 30, 'follow_location' => 1 ), 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false ) ); if(!empty($addheader)) { $opts['http']['header'] = $addheader; } $context = stream_context_create($opts); $data = @file_get_contents($url, false, $context); if($data !== false) { return $data; } } return false; } ```

该版本兼容HTTPS资源抓取、自动跟随301/302跳转,修复原函数不支持HTTPS、跳转资源抓取失败的问题。

场景3:目标站防盗链导致抓取失败

问题排查方法

在浏览器隐私模式下直接访问要抓取的图片地址,若可以正常打开但帝国CMS抓取失败,说明目标站开启了Referer防盗链,拒绝非本站来源的资源请求。

修复方法

帝国CMS远程图片抓取失败全场景排查与实操修复详细指南

修改远程抓取的请求头,伪造来源为目标站域名:打开/e/class/functions.php文件,搜索GetSaveUrlFile函数,在调用get_httpfile的代码前添加以下内容:

``` $parse_url = parse_url($url); $target_host = $parse_url['scheme'].'://'.$parse_url['host']; $addheader = array( 'Referer: '.$target_host, 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ); ```

然后找到原get_httpfile调用代码,将最后一个参数替换为$addheader,修改后的调用代码为:

``` $filedata = get_httpfile($url,0,0,$addheader); ```

保存文件后即可绕过大部分普通防盗链限制。

场景4:目录权限不足导致保存失败

问题排查方法

远程抓取的图片最终会保存到网站根目录下的/d/attachment/目录,若该目录无写入权限会导致抓取成功但保存失败。Linux服务器需要设置权限为755,所有者为www(或对应Web运行用户);Windows服务器需要给Users组赋予写入权限。

修复方法

  • 宝塔面板:进入【文件】找到/d/attachment/目录,右键【权限】设置权限为755,勾选【应用到子目录】确认即可
  • Linux命令行:执行以下命令(替换为你自己的网站根目录路径) ``` chown -R www:www /www/wwwroot/你的站点域名/d/attachment/ chmod -R 755 /www/wwwroot/你的站点域名/d/attachment/ ```

最终验证与问题排查

所有修改完成后,登录帝国CMS后台,进入【信息】-【增加信息】,在正文编辑器中粘贴带有远程图片的内容,提交后查看正文图片是否已替换为你站点的本地地址,对应目录下是否生成图片文件,若正常则修复完成。

若仍抓取失败,可在/e/class/connect.php的get_httpfile函数开头添加日志输出代码,排查具体错误:

``` file_put_contents(ECMS_PATH.'e/data/tmp/curl_log.txt', date('Y-m-d H:i:s').' 抓取地址:'.$url."\n", FILE_APPEND); ```

触发抓取操作后查看e/data/tmp/curl_log.txt文件,确认抓取地址是否正确,再对应排查网络、目标站封禁等问题。

相关推荐

最新

热门

推荐

精选

标签

易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。

Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图