2012-03-04 17 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