这更像是一个警告,而不是一个问题,但有人可能能够提供更好的解决方案。
我正从Android应用程序发送自定义请求标头。
当请求到达PHP服务器时,我检查是否存在此标头及其值。
为此,我使用 apache_request_headers()
获取标题数组,然后使用 array_key_exists()
检查标题。
但是, array_key_exists('custom-header', $Hdr)
会返回 false !
所以我用print_r转储数组,并且看,数组键确实存在于数组中。
这是输出:
Array
(
[Accept-Encoding] => gzip
[Connection] => Keep-Alive
[Content-Type] => application/x-www-form-urlencoded
[Content-Length] => 103
[Host] => www.somedomain.com
[custom-header] => my-custom-header-value
)
我是如何解决这个问题的?
像这样克隆数组:
// recuperate the request headers
$Hdr = apache_request_headers();
// clone the array as it will not correctly search with array_key_exists
$Keys = array_keys($Hdr);
$Values = array_values($Hdr);
$Headers = array();
for($i = 0; $i < count($Keys); $i++)
{
$Headers[$Keys[$i]] = $Values[$i];
}
现在,当我使用 array_key_exists('custom-header', $Headers)
查询新数组时,它会返回true!
这是一个已知问题吗?
有更好的解决方案吗?
注意:我更改了实际值的名称以保护我的代码,这里以此为例 - 请不要对这些值发布更正: - )
编辑:这发生在我在Apache版本2.2.22上运行PHP版本5.3.10的共享服务器上
答案 0 :(得分:1)
按照您的代码示例:
$Hdr = apache_request_headers();
$Keys = array_keys($Hdr);
$Values = array_values($Hdr);
$Headers = array();
for($i = 0; $i < count($Keys); $i++)
{
$Headers[$Keys[$i]] = $Values[$i];
}
var_dump($Hdr === $Headers); # true
我们可以得出结论$Hdr
等于$Headers
。 (为什么不会)
您应该知道array_key_exists
区分大小写,因此Custom-Header
和custom-header
的密钥不同。
你能不能尝试:
array_key_exists('custom-header', array_change_key_case($Hdr));
或稍微改变你的代码:
$Hdr = apache_request_headers();
$Headers = array();
foreach($Hdr as $Key => $Value)
{
$Headers[strtolower($Key)] = $Value;
}
答案 1 :(得分:1)
给出您的示例数据
Array
(
[Accept-Encoding] => gzip
[Connection] => Keep-Alive
[Content-Type] => application/x-www-form-urlencoded
[Content-Length] => 104
[Host] => androidgmap.letrajet.com
[User-Agent] => LeTrajet Edition Cèdre
[letrajet-sig] => 32dbc2........
)
这包含两个可能的问题,一个小写标题名称和“è”字符,它们可能会或可能不会在您的请求和/或比较代码中正确编码。需要更多细节来验证,但是:
key is missing : false
MyUserAgent == 'LeTrajet Edition Cèdre' : false
怀疑你有“è”字符的字符集问题。您需要在PHP代码中进行比较来解决这个问题。但是,此问题与数据有关,而与标题密钥无关。
你的代码中也有这个:
else if($MyUserAgent == "LeTrajet Edition Cedre"
如果您的数据中有Cèdre,那该怎么匹配?
编辑:根据OP的评论截断签名。