PHP Curl无法像命令行Curl下载目标EXE文件,仅得跳转页如何修复?
解决PHP Curl无法下载SourceForge文件的问题
问题描述
需要下载的文件链接:
https://sourceforge.net/projects/minpspw/files/SDK%20%2B%20devpak/pspsdk%200.11.2/pspsdk-setup-0.11.2r3.exe
使用命令行Curl可正常下载,命令如下(替换<URL>为上述链接):
curl --output pspsdk-setup-0.11.2r3.exe -L <URL>
该过程包含4次重定向,最终得到32.6 MB的EXE文件。但使用PHP Curl代码时,仅得到显示“Your download will start shortly...”的HTML跳转页面,而非实际的EXE文件。已尝试启用Referer、Cookie,并设置与命令行Curl相同的User-Agent,仍无法解决。
解决方案
问题核心是SourceForge的下载验证逻辑要求Curl正确处理Cookie读写,同时匹配命令行Curl的标准请求头。修改后的PHP代码如下:
<?php $cookieFile = "cookie.jar"; // 确保Cookie文件存在且具备读写权限 if (!file_exists($cookieFile)) { touch($cookieFile); chmod($cookieFile, 0644); } $c = curl_init(); curl_setopt($c, CURLOPT_URL, "https://sourceforge.net/projects/minpspw/files/SDK%20%2B%20devpak/pspsdk%200.11.2/pspsdk-setup-0.11.2r3.exe"); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); curl_setopt($c, CURLOPT_FOLLOWLOCATION, true); curl_setopt($c, CURLOPT_MAXREDIRS, 10); curl_setopt($c, CURLOPT_AUTOREFERER, true); // 同时配置Cookie的保存与读取,保证重定向请求携带验证所需Cookie curl_setopt($c, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($c, CURLOPT_COOKIEFILE, $cookieFile); curl_setopt($c, CURLOPT_USERAGENT, "curl/7.74.0"); // 添加命令行Curl默认的Accept头,匹配服务端请求校验规则 curl_setopt($c, CURLOPT_HTTPHEADER, [ "Accept: */*" ]); // 可选:若遇到SSL证书验证失败,可临时禁用(生产环境不推荐) // curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($c); if (curl_errno($c)) { echo "Curl错误: " . curl_error($c); } else { file_put_contents("pspsdk-setup-0.11.2r3.exe", $response); } curl_close($c); ?>
修改说明
- Cookie双向配置:同时启用
CURLOPT_COOKIEFILE和CURLOPT_COOKIEJAR,确保Curl在重定向过程中能读取并携带首次请求获取的验证Cookie,这是通过SourceForge下载校验的关键。 - 匹配请求头:添加
Accept: */*头,和命令行Curl的默认请求头保持一致,避免服务端返回跳转页面而非实际文件。 - Cookie文件预处理:提前创建并设置Cookie文件权限,防止Curl因文件读写失败导致请求异常。
内容的提问来源于stack exchange,提问作者zomega
相关产品推荐
相关产品推荐

