PHP 7.2 通过 cURL 设置 Firefox 风格请求头(如 User-Agent、Accept 等)和匹配的 Content-Type 来模拟 Firefox 请求,而非真正模拟浏览器;需避免添加 Referer、Cookie 或 X-Requested-With 等非必要头,POST 表单用关联数组自动编码,JSON 提交需手动 json_encode 并设 application/json 头。

PHP 7.2 本身不“模拟浏览器”,而是通过 cURL 发起 HTTP 请求;要让目标服务器认为请求来自 Firefox,关键在于设置符合 Firefox 行为的 User-Agent 和其他常见请求头,而非模仿渲染或 JS 执行能力。
设置 Firefox 风格的请求头
Firefox 当前主流版本(如 120+)的典型 User-Agent 类似:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0在 cURL 中需手动添加该头,同时建议补全 Accept、Accept-Language、Connection 等字段,提升兼容性:
- 用
CURLOPT_HTTPHEADER设置完整头数组,包括User-Agent、Accept、Accept-Language、Accept-Encoding、Connection: keep-alive - 避免设置
Referer或Cookie除非目标接口明确需要,否则可能引发校验失败 - 不要加
X-Requested-With: XMLHttpRequest—— 这是 Ajax 特征,Firefox 普通表单提交不带此头
POST 数据格式必须匹配 Content-Type
仅改 User-Agent 不够:服务端会根据 Content-Type 解析请求体。PHP 7.2 的 cURL 默认不自动设该头,必须显式指定:
立即学习“PHP免费学习笔记(深入)”;
- 发表单数据(如登录):传关联数组给
CURLOPT_POSTFIELDS,cURL 自动编码为application/x-www-form-urlencoded,此时应确保Content-Type头也设为此值 - 发 JSON(如调 API):先
json_encode($data),再设Content-Type: application/json,且CURLOPT_POSTFIELDS必须接收字符串 - 漏设或错设 Content-Type 是 400 错误最常见原因
基础可运行示例(PHP 7.2 兼容)
以下代码在 PHP 7.2 下可直接运行,模拟 Firefox 提交表单:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://httpbin.org/post');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['q' => 'php firefox', 'page' => 1]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 开发时临时跳过证书校验
// 模拟 Firefox 请求头
$firefox_headers = [
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding: gzip, deflate',
'Content-Type: application/x-www-form-urlencoded',
'Connection: keep-alive',
'Upgrade-Insecure-Requests: 1'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $firefox_headers);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false) {
echo 'cURL error: ' . curl_error($ch);
} else {
echo "HTTP $http_code\n" . substr($response, 0, 500);
}
注意事项与常见坑
- PHP 7.2 不支持
stream_context_create中的PATCH等非标 method(需 7.4+),但标准 POST 完全没问题 - 别用
@file上传文件 —— PHP 7.2 已弃用该语法,应改用CURLFile类(如需上传) - 若目标站点有反爬机制(如检查
Sec-Fetch-*头),PHP 无法原生发送这些现代浏览器头,需确认是否真有必要;多数常规 POST 场景无需处理 - 响应为空?优先检查
CURLOPT_RETURNTRANSFER是否为true,以及curl_exec是否返回false



















