【问题标题】:apache_request_headers and array_key_exists [closed]apache_request_headers 和 array_key_exists [关闭]
【发布时间】:2012-08-29 09:36:00
【问题描述】:

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

我正在从我的 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

【问题讨论】:

  • isset($Hdr["Custom-header"]) 会返回 true 吗?
  • 你能真正提供你有问题的代码吗?对于某些数组它不起作用是没有意义的,但是当你将这些东西复制到一个相同的数组时,它就起作用了。至少,我希望看到一个显示行为的具体测试用例。
  • @Passerby - 不,这也不起作用。
  • @eis - 具体代码就是我所描述的。我无法从我的 Android 应用程序中提供代码。我完全同意这没有意义。再次注意:当外部应用程序向 PHP 服务器发出请求时会发生这种情况。因此,需要对现实生活中的示例进行编码以进行测试。如果您也是一名 Android 开发人员,我相信您能够将这些放在一起。
  • 具体代码或者它没有发生。如果没有可复制的可验证示例,这根本不可信。很难接受您关于 PHP 的 stock 数据结构“不起作用”的解释。

标签: php android http-headers


【解决方案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;
}

【讨论】:

    【解决方案2】:

    鉴于您的示例数据

    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 中的 cmets 截断签名。

    【讨论】:

    • 你到底是从哪里得到这个的?这根本不是我发布的数据!
    • 来自用户 rlemon 在 cmets 中发布的数据,作为对索要代码的回应。请参阅问题 cmets。如果那不是正确的数据/源代码,请立即告诉我们,最好提供正确的。
    • 我看到你决定去从我的服务器上拿走我的代码,尽管我说我想保护我的代码。未经我允许,请删除您在此处复制的数据!
    • @Simon 嗯,如果你想保护你的代码,你可能不应该把它发布到互联网上,对吧?我可以在此处对其进行编辑,但这并不意味着它对所有人都可用,并且无助于解决问题。
    • @Simon 这不是代码,它是公共信息的标头请求。更不用说您的 url 现在在修订版中永远存储在 SO 上。在提出问题之前,您应该解析所有不需要的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多