【问题标题】:Can't Set "Host:" Header with CURL Request无法使用 CURL 请求设置“主机:”标头
【发布时间】:2013-02-05 08:16:12
【问题描述】:

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

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

这是进行 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=='

【问题讨论】:

    标签: php authentication curl header


    【解决方案1】:

    Host 标头不接受完整的 URL,而只接受主机名。

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

    "Host: $url"
    

    与:

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

    【讨论】:

      【解决方案2】:

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

      cURL 应该会自动从CURLOPT_URL 生成它。

      【讨论】:

        【解决方案3】:

        Host 标头不应包含协议,仅包含主机名。所以在这种情况下,你只需要localhost:

        'Host: localhost'
        

        【讨论】:

          【解决方案4】:

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

          诀窍是让 cURL 不生成它自己的标题(我还没有弄清楚如何做)或者不发送你的。在你的情况下,似乎不发送你的很好。但是,对于我正在做的事情,我必须发送我的。

          【讨论】:

            猜你喜欢
            • 2012-02-10
            • 1970-01-01
            • 1970-01-01
            • 2019-08-18
            • 1970-01-01
            • 2015-06-03
            • 1970-01-01
            • 1970-01-01
            • 2013-06-13
            相关资源
            最近更新 更多