为什么这个PHP header()重定向会陷入无限循环?


Why does this PHP header() redirect get stuck in an infinite loop?

我有这段代码,它应该获得当前日期,将其与设置的结束日期进行比较,并在当前日期超过结束日期时进行重定向。每当我将$promoend设置为过去的日期时,我就会陷入重定向循环。

if()块应该只在促销已经结束并且我还没有在close .php页面上时重定向。

$currentdate = new DateTime("now");
$promoend = new DateTime("11/01/2010 00:00:00");
$promoend = $currentdate->diff($promoend)->invert;
if ($promoend && !strpos($_SERVER["PHP_SELF"],"closed.php")) {
    header("Location: ".$environment->root."/closed.php");
}

知道为什么这是一个循环吗?

如果指针('closed.php')位于干草堆($_SERVER['PHP_SELF'])的开头,strpos可以返回0。因为你没有使用严格的比较运算符,所以PHP会将其处理为'false'。

必须使用严格比较运算符来检查这种情况:

if ($promoend && (strpos(...) !== FALSE)) {
   header(...);
}


if ($promoend && !strpos($_SERVER["PHP_SELF"],"closed.php")) {
    header("Location: ".$environment->root."/closed.php");
}

...should probably be...


if ($promoend && strpos($_SERVER["PHP_SELF"],"closed.php")!==true) {
    header("Location: ".$environment->root."/closed.php");
}

因为strpos()并不总是返回一个布尔值,所以你必须使用PHP等价操作符

假设你的日期计算是正确的,原因是,strpos返回0,因为你在PHP_SELF中寻找的字符串位于0位置。

你必须使用!== "而不是!val因为0和"和NULL是一样的