2012-02-05 72 views
10

我試圖通過PHP cURL登錄到一個網站,我只收到「錯誤的請求」響應。PHP cURL內容長度和內容類型錯誤

我玩過hosts文件並將其設置到我的服務器,以檢查我的瀏覽器發送了哪個請求頭,並將其與由cURL發送的請求頭進行比較。

一切都是平等的,除外:

瀏覽器:

Content-Type: application/x-www-form-urlencoded 
Content-Length: 51 

PHP捲曲:

Content-Length: 51, 359 
Content-Type: application/x-www-form-urlencoded; boundary=----------------------------5a377b7e6ba7 

我已經設定值,使用此命令,但它仍然發出了錯誤的頭:

curl_setopt($this->hCurl, CURLOPT_HTTPHEADER, array(
    'Expect:', 
    'Content-Type: application/x-www-form-urlencoded', 
    'Content-Length: 51' 
)); 

回答

31

您不應該自己設置內容長度。如果您使用cURL發送HTTP POST,它將爲您計算內容長度。

如果您將CURLOPT_POSTFIELDS值設置爲數組,它將自動提交請求multipart/form-data並使用邊界。如果你傳遞一個字符串,它將使用application/x-www-form-urlencoded,所以確保你傳遞一個urlencoded字符串到CURLOPT_POSTFIELDS而不是一個數組,因爲你想要表單urlencoded。

你必須這樣做:

$data = 'name=' . urlencode($value) . '&name2=' . urlencode($value2); 
curl_setopt($this->hCurl, CURLOPT_POSTFIELDS, $data); 

// NOT 

$dataArray = array('name' => 'value', 'name2' => 'value2'); 
curl_setopt($this->hCurl, CURLOPT_POSTFIELDS, $dataArray); 

在這兩種情況下,你不需要設置內容長度,但你必須使用第一種方法來獲取表單上application/x-www-form-urlencoded編碼。

如果這沒有幫助,請發佈與設置curl請求相關的所有代碼(所有選項以及您傳遞給它的數據),這應該有助於解決問題。

編輯:

添加是我想出了工作(我得到失敗的登錄)的一個例子。

<?php 

$URL_HOME = 'http://ilocalis.com/'; 
$LOGIN_URL = 'https://ilocalis.com/login.php'; 

$ch = curl_init($URL_HOME); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

$home = curl_exec($ch); 

//echo $home; 

$post = array('username' => 'drew', 'password' => 'testing 123'); 
$query = http_build_query($post); 

curl_setopt($ch, CURLOPT_URL, $LOGIN_URL); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $query); 

$login = curl_exec($ch); 

echo $login; 
+1

感謝您的評論,我不知道傳遞數組和傳遞字符串是有區別的。但http_build_query($ array)也應該可以工作,不是嗎?無論如何 - 不幸的是,它也不管用。當我自己沒有指定內容長度時,頁面返回「HTTP錯誤411長度要求」錯誤。我正在嘗試登錄http://ilocalis.com/(發佈到https://ilocalis.com/login.php) - 如果您想自己嘗試,則不需要帳戶,因爲我甚至不要來加載頁面,並檢查給定的憑據是否正確...謝謝! – Simon 2012-02-07 18:39:20

+0

由於內容長度未設置,我不知道請求方法是不是POST,或者也許其他一些選項重寫。無論如何,我通過一個實例更新了這篇文章。希望它能讓你走上正軌。它使用1個捲曲對象來創建2個獨立的請求。請注意,如果您需要再次進行GET查詢,則必須將CURLOPT_POST重置爲0. – drew010 2012-02-07 23:42:50

+0

謝謝。您。所以。許多。我沒有看到樹木的森林。我將curlopt_customrequest設置爲「POST」,因爲我用來傳遞一個數組到curlopt_postfields .....使用一個字符串,因爲你已經提到它應該工作,但我偶然忘記刪除customrequest的東西..這是小事情,怪胎當我們不明白爲什麼它不起作用時,我們程序員的狗屎......;) – Simon 2012-02-08 09:10:19