我的cURL请求混淆了一些服务器


My cURL request confuses some servers?

我正在使用以下脚本发出cURL发布请求,该脚本将发布到表单处理脚本:

$url = "http://www.example.com/process_script.php";
$referer = "http://www.example.com";
$agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11";
$postdata = array('message' => 'Hello, World!', 'name' => 'Bob');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_exec($ch);

它在某些url上运行良好。此外,当我把它发布到我的测试脚本(它只输出referer、agent和postdata)时,它运行得很好。

然而,有些服务器给了我这个奇怪的"服务器无法理解您的查询"错误。它不是403,因为当我删除用户代理选项时,我会得到403。用户代理字符串是否有问题?它是直接从我的实际浏览器中提取的。

我需要设置更多选项来模拟真实的浏览器吗?

我不确定,但请尝试一下:

$postdata = array('message' => 'Hello, World!', 'name' => 'Bob');
$postdata = http_build_query($postdata);

这样做的原因是,如果使用http_build_query()返回的url编码字符串发布表单,则会使用enctype application/x-www-form-urlencoded发布表单。使用数组时,会产生multipart/form-data

可能是某些表单期望urlencoded数据,而不理解(或拒绝处理)以multipart/form-data编码发送的表单。

关于CURLOPT_POSTFIELDS:

此参数可以作为url编码的字符串传递,如'para1=val1&para2=val2&…'或以字段名为键的数组并将字段数据作为值。如果值是数组,则Content-Type标头将设置为多部分/表单数据
来源:curl_setopt()