2013-02-20 109 views
2

我想通過一些基本認證(通過發送加密的標頭)進行CURL請求。但是,當我嘗試設置"Host: _"標頭時,遠程服務器響應:無法設置「主機:」帶CURL請求的標頭

錯誤的請求:您的瀏覽器發送了此服務器無法理解的請求。

這是使CURL調用的代碼。請注意,只要我註釋掉$http_header變量中的"Host: url"標題,它就會生效。但是,它在目標服務器上用作身份驗證過程的一部分,因此我不能簡單地將其刪除。

$curl = curl_init(); 

    $opt = array(
     CURLOPT_URL=>$url, 
     CURLOPT_RETURNTRANSFER=>1, 
     CURLOPT_HTTPHEADER=>$http_header, 
     CURLOPT_POST=>1, 
     CURLOPT_POSTFIELDS=>$data_params, 
     CURLOPT_CONNECTTIMEOUT=>5, // Timeout to 5 seconds 
    ); 
    curl_setopt_array($curl, $opt); 

    // $output contains the output string 
    $output = curl_exec($curl); 

    // it closes the session 
    curl_close($curl); 

$http_header內容(關聯數組):

array 
    0 => string 'Host: http://localhost/work/myproject' 
    1 => string 'Content-Type: multipart/form-data' 
    2 => string 'X-Authorization: Basicauth Z2xZjA2YzJhMzIxYTI1ZmIzZTgxYQ==' 

回答

2

Host標頭不接受完整的URL,但只接受主機名。

在這種情況下,解決辦法是更換此標題:

"Host: $url" 

有:

"Host: ". parse_url($url, PHP_URL_HOST) ." 
1

Host頭不應包含協議中,只有主機的名稱。因此,在這種情況下,所有你需要的是localhost

'Host: localhost' 
2

Host頭需要一個主機名,而不是URL。即localhost,而不是http://localhost/work/myproject

cURL應該從CURLOPT_URL自動生成它。

0

我不認爲任何答案回答提問者的問題。我遇到了同樣的問題。從查看cURL發送的內容來看,它正在發送它自己的主機頭。這意味着當你添加一個你現在有兩個。所有服務器在看到多個主機頭時必須響應400錯誤。

訣竅是讓cURL不要生成它自己的頭(我還沒有想出如何去做)或不發送給你。在你的情況下,它似乎不發送你的罰款。但是,對於我所做的,我必須發送我的。