2013-02-20 53 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不要生成它自己的头(我还没有想出如何去做)或不发送给你。在你的情况下,它似乎不发送你的罚款。但是,对于我所做的,我必须发送我的。