我有一个非常令人沮丧的问题,我无法检索任何标题。这是我的代码:
$headers = getallheaders();
echo($headers["SystemTime"]); //Doesnt work
$keys = array_keys($headers);
echo($headers[$keys[4]]); //Doesnt work
两行都产生错误'Undefined index:SystemTime'。
我无法为我的生活找出为什么我无法获得价值。如果我去print_r($headers);
我得到了这个
Array
(
[Content-Type] => application/x-www-form-urlencoded
[Content-Length] => 0
[Host] => localhost
[Referer] =>
[SystemTime] => 2012-06-26+09%3a20%3a27
)
$ header的var_dump
array(5) {
["Content-Type"]=>
string(33) "application/x-www-form-urlencoded"
["Content-Length"]=>
string(1) "0"
["Host"]=>
string(9) "localhost"
["Referer"]=>
string(0) ""
["SystemTime"]=>
string(23) "2012-06-26+10%3a10%3a08"
}
$ keys的var_dump
array(5) {
[0]=>
string(12) "Content-Type"
[1]=>
string(14) "Content-Length"
[2]=>
string(4) "Host"
[3]=>
string(7) "Referer"
[4]=>
string(10) "SystemTime"
}
foreach ($headers as $name => $value) {
echo "$name: $value. From Array: {$headers[$name]}\n";
}
返回:
Connection: Keep-Alive. From Array: Keep-Alive
Content-Type: application/x-www-form-urlencoded. From Array: application/x-www-form-urlencoded
Content-Length: 0. From Array: 0
Host: localhost. From Array: localhost
Referer: . From Array:
Notice: Undefined index: SystemTime in /clientdata/apache-www/a/d/[XXXXXX].com/www/admin/request/GetPCLicence.php on line 22
SystemTime: 2012-06-26+10%3a10%3a08. From Array:
我陷入了困境,我真的无法弄清楚出了什么问题。它应该工作。
PS。我知道SystemTime标头是非标准的。我从我的http_request提供了这个。
答案 0 :(得分:3)
在你们的帮助下我得到了它。我有一种感觉,因为它在反序列化后起作用,可能编码是不同的,这就是为什么我们可以看到它,但不能触摸它?
下面的代码获取所有标头并转换编码并将其放入新数组中:)
这是我的“翻译”代码。
$headersRaw = getallheaders();
$headers = array();
foreach($headersRaw as $key => $value)
{
$headers[mb_convert_encoding($key, "UTF-8")] = $value;
}
答案 1 :(得分:0)
此时您最好的选择可能是使用$_SERVER
超全局获取您需要的任何标头的值(例如$_SERVER['HTTP_SYSTEMTIME']
。
我无法通过调用getallheaders()
并在SystemTime
标头设置为2012-06-26+10%3a10%3a08
的情况下发送自己的自定义请求来重现我的系统(PHP 5.4.3)上的问题。它按预期工作,我看到打印出的值两次(一次使用getallheaders()
,一次使用$_SERVER
。这很可能是一个奇怪的PHP错误,因为我没有看到任何关于函数apache_request_headers
,或者它在PHP的5.2.17分支中的代码有什么奇怪的。
希望这有助于暂时。无论如何,使用$_SERVER['HTTP_*']
可能更可靠,因为getallheaders
并非在所有配置中都可用。