2012-03-04 51 views
1

我正在用下面的脚本会发布到表格处理脚本的卷曲POST请求:我的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); 

它正常工作的一些网址。另外,当我将它发布到我的测试脚本(它只输出引用者和代理以及postdata)时,它工作得很好。

但是,有些服务器给我这个奇怪的“服务器无法理解你的查询”错误,虽然。这不是403,因为当我删除用户代理选项时,我得到了403.用户代理字符串有什么问题吗?它直接从我的实际浏览器中拉出来。

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

+0

如果确实引用了消息,因为它是,它的服务器的一个内部错误。我建议首先检查你的参数:也许他们应该用大写字母或其他名字命名。 ) – raina77ow 2012-03-04 23:04:32

回答

2

我不知道,但试试这个来代替:

$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的& ...'或者作为与字段名称的数组作为键 和字段数据作为值。如果值是数组,则内容类型头 将被设置为的multipart/form-data的
来源:curl_setopt()

+0

谢谢,就是这样! – Joey 2012-03-04 23:17:16

+0

非常好,我总是使用urlencoded字符串,除非我需要发布文件或其他东西;那么使用数组更容易。很高兴这是它。 – drew010 2012-03-04 23:18:49