作为最小测试用例,使用PHP 5.6.31版,cURL 7.54.0:
<?php
$headers = array('Authorization: B', 'c : d');
$ch = curl_init("https://ipandheaders.com");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_exec($ch);
curl_close ($ch);
?>
该网站反映了已发送的标头:
Accept: */*
C: d
Host: ipandheaders.com
如果我故意拼错它:
$headers = array('Authorizationx: B', 'c : d');
结果是
Accept: */*
Authorizationx: B
C: d
Host: ipandheaders.com
或
$headers = array('Authorizatio: B', 'c : d');
给出
Accept: */*
Authorizatio: B
C: d
Host: ipandheaders.com
使用更真实的标题(使用虚假标记)
$headers = array('Authorization: Bearer JHG56HJGOJ8JH876F', 'c : d');
没有帮助。
Accept: */*
C: d
Host: ipandheaders.com
错误日志显示没有错误。
我的方法似乎在这里有效: How to include Authorization header in cURL POST HTTP Request in PHP? 但那是5年前的事了。有什么变化吗?
我试过POSTing
curl_setopt($ch, CURLOPT_POST, 1);
但因某些看似无关的原因而得到403 Forbidden错误,所以我不知道POST的结果。
PHP是否只允许POST中的Authorization标头?我可以用Python做我想做的事情&#39;请求&#39;使用GET没有问题。
如果PHP的cURL扩展程序故意禁止任何授权标头,我不会看到http://php.net/manual/en/function.curl-setopt.php显示的内容,但 tychay 的评论似乎在说是这样。
答案 0 :(得分:0)
不确定这是否有帮助:
从7.58.0开始,除非使用CURLOPT_UNRESTRICTED_AUTH选项明确允许,否则libcurl将专门阻止将“ Authorization:”标头发送到第一个使用的主机之外的其他主机。
来源:https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html
根据以上所述,您可能需要包括CURLOPT_UNRESTRICTED_AUTH选项:
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);