【问题标题】:My cURL request confuses some servers?我的 cURL 请求混淆了一些服务器?
【发布时间】:2012-03-04 23:00:46
【问题描述】:

我正在使用以下脚本发出 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 上运行良好。此外,当我将它发布到我的测试脚本(它只输出引用者、代理和 postdata)时,它工作得很好。

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

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

【问题讨论】:

  • 如果您确实按原样引用了该消息,则为服务器内部错误。我建议先检查您的参数:也许它们应该以大写或其他形式命名。 )

标签: php curl


【解决方案1】:

我不确定,但试试这个吧:

$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

此参数可以作为 urlencoded 字符串传递,例如 'para1=val1&para2=val2&...' 或以字段名称为键的数组 和字段数据作为值。如果 value 是一个数组,Content-Type 标头 将设置为 multipart/form-data
来源:curl_setopt()

【讨论】:

  • 太好了,除非我需要发布文件或其他东西,否则我总是使用 urlencoded 字符串;然后使用数组更容易。很高兴就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
相关资源
最近更新 更多