适用版本与前置准备
本指南适配帝国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防盗链,拒绝非本站来源的资源请求。
修复方法

修改远程抓取的请求头,伪造来源为目标站域名:打开/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文件,确认抓取地址是否正确,再对应排查网络、目标站封禁等问题。