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

时间:2011-09-06 20:29:47

标签: php redirect infinite-loop

我有这段代码应该获取当前日期,将其汇总到设定的结束日期,如果当前日期超过结束日期则重定向。每当我将$ promoend设置为过去的日期时,我就会陷入重定向循环。

if()块只应在促销结束且我不在closed.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");
}

知道为什么会陷入循环吗?

3 个答案:

答案 0 :(得分:5)

如果针('closed.php')位于haystack的开头(<_SERVER ['PHP_SELF']),

strpos可以返回0。这将被PHP视为'false',因为您没有使用严格的比较运算符。

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

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

答案 1 :(得分:1)


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

......应该是......


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

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

答案 2 :(得分:0)

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

你必须使用!==“”而不仅仅是!val因为0与“”是相同的“