无法使用CURL请求设置“主机:”标头

时间:2013-02-20 10:50:50

标签: php authentication curl header

我正在尝试使用一些基本身份验证(通过发送加密标头)发出CURL请求。但是,当我尝试设置"Host: _"标头时,远程服务器响应:

  

错误请求:您的浏览器发送了此服务器无法理解的请求。

这是进行CURL调用的代码。请注意,只要我在"Host: url"变量中注释掉$http_header标题,它就会起作用。但是,它在目标服务器上用作身份验证过程的一部分,因此我不能简单地将其删除。

    $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=='

4 个答案:

答案 0 :(得分:3)

Host标头不接受完整的网址,只接受主机名。

在这种情况下,解决方案是替换此标头:

"Host: $url"

使用:

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

答案 1 :(得分:2)

Host标头采用主机名,而不是URL。即localhost,而不是http://localhost/work/myproject

cURL应该从CURLOPT_URL自动生成它。

答案 2 :(得分:1)

Host标头不应包含协议,只包含主机名称。因此,在这种情况下,您只需要localhost

'Host: localhost'

答案 3 :(得分:0)

我不认为答案可以回答提问者的问题。我遇到了同样的问题。从查看cURL发送的内容来看,它正在发送自己的主机头。这意味着当你添加一个时,你现在有两个。当所有服务器看到多个主机头时,它们必须以400错误响应。

诀窍是让cURL不要生成它自己的标题(我还没知道怎么做)或者不发送你的标题。在你的情况下似乎不发送你的是好的。但是,对于我正在做的事情,我必须发送我的。