我正在尝试使用一些基本身份验证(通过发送加密标头)发出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=='
答案 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不要生成它自己的标题(我还没知道怎么做)或者不发送你的标题。在你的情况下似乎不发送你的是好的。但是,对于我正在做的事情,我必须发送我的。