1

好吧,我的朋友给了我这段代码,用于请求标头并将它们与标头应该是什么进行比较。它工作得很好,但我不知道为什么。这是代码:

    $headers = apache_request_headers(); 
    $customheader = "Header: 7ddb6ffab28bb675215a7d6e31cfc759"; 
    foreach ($headers as $header => $value) { // 1
        $custom .= "$header: $value"; // 2
    }
    $mystring = $custom;  // 3
    $findme   = $customheader; // 4
    $pos = strpos($mystring, $findme); 
    if ($pos !== false) {
// Do something
} else{ exit(); } //If it doesn't match, exit.

我评论了一些与以下问题相关的数字:

  1. 这里到底发生了什么?是否将 $headers 设置为 $header AND $value?

  2. 同样,不知道这里发生了什么。

  3. 为什么将变量设置为不同的变量?这是变量被使用的唯一区域,那么是否有理由将其设置为其他内容?

  4. 与3相同的问题。

如果这是一个可怕的问题,我很抱歉,但它一直困扰着我,我真的很想知道它为什么有效。好吧,我明白它为什么会起作用,我想我只是想更具体地知道。感谢您提供的任何见解。

4

3 回答 3

3
 $headers = apache_request_headers(); 

获取标头数组。

    $customheader = "Header: 7ddb6ffab28bb675215a7d6e31cfc759"; 

定义了它将搜索的“customheader”。

    foreach ($headers as $header => $value) { // 1
        $custom .= "$header: $value"; // 2
    }

循环并创建一个$custom变量来保存扩展的$key=>$value标题。

    $mystring = $custom;  // 3
    $findme   = $customheader; // 4
    $pos = strpos($mystring, $findme); 

$customheader在展开的字符串中查找。

    if ($pos !== false) {
// Do something
} else{ exit(); } //If it doesn't match, exit.

确实不需要重新分配变量。本质上,它获取标题数组并将其转换为一个大字符串,然后搜索该字符串以查看$customheader文本是否存在。

于 2010-04-24T02:36:51.043 回答
1
  1. 它遍历 $headers,将每个元素的键分配给 $header,将值分配给 $value。因此,在块内,我们在单独的变量中获取标头的名称及其值。
  2. 在这一步中,我们使用点运算符将所有标题连接到一个字符串中。本质上,我们将标头从数组转换为字符串。
  3. 除非这些变量在其他地方使用,否则没有理由重新分配。

免责声明:我是一个红宝石人,所以如果我错了,请纠正我。

于 2010-04-24T02:35:34.747 回答
1

apache_request_headers()HTTP返回当前请求中所有标头的关联数组,false如果失败则返回。因此,最好将返回值检查为:

$headers = apache_request_headers(); 
if(! $headers) {
 die("Error fetching headers");
}

1:您正在迭代您获得的关联数组。
2:在数组中形成一串粘合的键值对,键和值之间用冒号隔开。
3 和 4 只是将一个变量分配给另一个变量。您可以直接使用: $pos = strpos($custom, $customheader);代替步骤 3 和 4。如果找不到您的位置,则strpos返回,否则返回找到的位置。false$customheader$custom

总体而言,此代码段检查您的自定义标头是否存在于apache_request_headers.

于 2010-04-24T02:43:58.257 回答