
php 中使用 curl 访问某些网站(如 vueling.com)返回 “access denied”,但命令行 curl 却能正常获取响应,根本原因通常是 php curl 缺少合法 user-agent 头,被目标服务器识别为爬虫或非法请求而拦截。
php 中使用 curl 访问某些网站(如 vueling.com)返回 “access denied”,但命令行 curl 却能正常获取响应,根本原因通常是 php curl 缺少合法 user-agent 头,被目标服务器识别为爬虫或非法请求而拦截。
当您在终端执行 curl -v https://www.vueling.com/en 时,curl 默认会发送一个标准的、人类浏览器友好的 User-Agent(例如 curl/8.5.0),多数网站允许该 UA 访问;而 PHP 的 curl_exec() 默认不设置 User-Agent,导致请求头中缺失该字段,或仅发送空值/极简值(如 PHP),极易被 WAF(如 Cloudflare)或服务器规则拦截,直接返回 <h1>Access Denied</h1>。
✅ 正确做法:显式设置符合常规浏览器行为的请求头,尤其是 User-Agent。以下是修复后的完整示例:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.vueling.com/en');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 关键:启用返回值,避免直接输出
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 生产环境建议保持 true 并配置 CA 证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
// ✅ 必须添加:模拟主流浏览器 User-Agent
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36');
// 可选:补充常见请求头,增强可信度
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-US,en;q=0.5',
'Accept-Encoding: gzip, deflate',
'Connection: keep-alive',
'Upgrade-Insecure-Requests: 1',
]);
$data = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($data === false) {
echo 'cURL Error: ' . curl_error($ch);
} elseif ($httpCode !== 200) {
echo "HTTP $httpCode returned. Response:\n" . substr($data, 0, 500);
} else {
echo "Success! Page length: " . strlen($data) . " bytes";
}
⚠️ 注意事项:
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
-
CURLOPT_RETURNTRANSFER => true是关键,否则curl_exec()会直接输出内容并返回true/false,无法捕获 HTML; - 避免在生产环境中使用
CURLOPT_SSL_VERIFYPEER => false,应通过curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem')指定权威证书; - 若仍被拦截,可尝试启用
CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE模拟会话,或增加随机延迟、轮换 User-Agent; - 使用
curl_getinfo($ch)检查真实 HTTP 状态码与重定向路径,辅助调试。
总结:服务器对 CLI 与 PHP cURL 的差异化响应,本质是请求指纹识别差异。补全规范请求头(尤其 User-Agent)、启用 CURLOPT_RETURNTRANSFER、校验 HTTP 状态码,是解决此类“Access Denied”问题的标准三步法。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










