-2

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

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

4

2 回答 2

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;
}
于 2012-08-29T14:13:31.777 回答
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 的评论截断签名。

于 2012-08-29T14:50:31.113 回答