用cURL设置CURLOPT_REFERER可绕过基于来源域校验的防盗链,因服务端常只验证Referer是否在白名单内;示例代码含SSL、User-Agent等完整配置及错误处理。

PHP 用 cURL 设置 Referer 访问远程文件
直接用 file_get_contents() 或 fopen() 打开带防盗链的远程文件通常会失败,返回空内容或 403 错误。关键不是“怎么打开”,而是“怎么模拟浏览器请求”——curl_setopt() 设置 CURLOPT_REFERER 是最常用、最可控的方式。
为什么 Referer 能绕过部分防盗链
很多服务器只校验请求头中的 Referer 是否来自白名单域名,不验证 User-Agent 或 Cookie。只要伪造一个合法来源(比如目标站自己的首页),就可能通过校验。
- Referer 是 HTTP 请求头字段,服务端可通过
$_SERVER['HTTP_REFERER']读取 - 不是所有防盗链都依赖 Referer;有些还结合 User-Agent、Token 或时间戳,但 Referer 是最基础且易伪造的一环
- 注意:伪造 Referer 不违法,但需遵守目标网站
robots.txt和服务条款
cURL 完整设置示例(含错误处理)
以下代码能稳定获取带 Referer 校验的图片、PDF 或文本资源:
function fetchWithReferer($url, $referer = 'https://example.com/') {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_REFERER, $referer); // 关键:设置来源页
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
$content = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200 || $content === false) {
throw new Exception("HTTP {$httpCode}: failed to fetch {$url}");
}
return $content;
}
// 使用
try {
$data = fetchWithReferer('https://site.com/file.pdf', 'https://site.com/download/');
file_put_contents('local.pdf', $data);
} catch (Exception $e) {
echo $e->getMessage();
}
常见失败原因和应对点
Referer 设置了还是 403?别急着换库,先检查这几个硬性条件:
立即学习“PHP免费学习笔记(深入)”;
-
CURLOPT_FOLLOWLOCATION开启后,重定向过程中的 Referer 可能被清空(尤其跨域重定向),可改用CURLOPT_HEADERFUNCTION手动跟踪跳转并重设 Referer - 目标 URL 是 HTTPS,但
CURLOPT_SSL_VERIFYPEER设为false时,某些旧版 cURL 会拒绝发送 Referer —— 改用true并配置 CA 证书路径更稳妥 - Referer 值末尾是否带斜杠?
https://site.com和https://site.com/在部分 Nginx 配置下会被视为不同来源 - 有些站点校验 Referer 的同时要求匹配特定
User-Agent,此时必须同步设置CURLOPT_USERAGENT











