apache_request_headers和array_key_exists

时间:2012-08-29 09:36:00

标签: php android http-headers

这更像是一个警告,而不是一个问题,但有人可能能够提供更好的解决方案。

我正从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的共享服务器上

2 个答案:

答案 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-Headercustom-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的评论截断签名。