重定向太多 - cookie JS + php 实现

Too many redirects - cookies JS + php implementation

我有一个简单的网站,您只需要一个密码就可以访问其中的内容。然后有 3 个字段,用户输入数据,然后存储在 cookie 中。最后 - 有一个注销脚本可以重置会话并取消设置 cookie。

请在下面找到相关代码:

登录页面(索引)

<?php
session_start();

$password = '';
$wrongPassword = '';
if (isset($_POST['sub'])) {
$password = $_POST['login_passcode'];
if ($password === 'PASSCODE') {
    $_SESSION['login'] = true;
    header('LOCATION:/personal.php');
    die();
} else {
    $wrongPassword = true;
}
}

if (isset($_COOKIE['m_username'])) {
header('LOCATION:/personal.php');
die();
}
?>

内容页面,用户输入姓名、部门和开始日期

<?PHP
session_start();
if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) {
header("Location:/index.php");
die();
}
?>

和注销脚本:

<?PHP
session_start();
if (isset($_COOKIE[session_name()])):
    setcookie(session_name(), '', time() - 7000000,'/');
endif;
if (isset($_COOKIE['m_username'])):
    setcookie('marriott_username', '', time() - 7000000,'/');
endif;
if (isset($_COOKIE['m_startdate'])):
    setcookie('marriott_startdate', '', time() - 7000000,'/');
endif;
if (isset($_COOKIE['m_department'])):
    setcookie('m_department', '', time() - 7000000,'/');
endif;
$_SESSION = array();
session_destroy();
header ("Location:/index.php");
die();
?>

jQuery 创建以下 cookie:

function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
    var expires = "expires=" + d.toUTCString();
    document.cookie = cname + "=" + cvalue + "; " + expires;
}

Cookie 会过期(至少在 chrome),但是在几小时或几天后尝试访问网站后,我收到有关重定向过多的错误。我相信这可能是由于会话过期时间和 cookie 过期时间(cookie 为 5 天)之间存在一些差异,但我真的不知道从哪里开始修复这些...

此外,在 Internet Explorer (IE8) 上,即使我直接注销也会出现重定向问题。

如有任何帮助,我们将不胜感激, E.

您认为不同的 cookie 过期是导致重定向过多问题的原因是正确的。

如果 isset($_COOKIE['m_username']) 在索引页面中为真,那么您将被重定向到个人页面,如果 if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) 也为真,它会将您送回索引,因此创建一个环形。这是由于会话 cookie 在您设置的 cookie 之前过期造成的。

$_COOKIE$_SESSION 超全局指的是两组不同的 cookie。一种解决方案是仅使用 PHP 会话并将所有会话数据存储在 $_SESSION 超全局中。

例如:

$_SESSION['m_username'] = 'whatever_value';

然而,这会产生额外的内存使用开销。如果您仍想使用自己的 cookie,则只需确保确定重定向的任何逻辑都基于会话,而不是您设置的 cookie 的存在。

例如:

// When logging in
$_SESSION['logged_in'] = true;

// On every page that requires login
if(!$_SESSION['logged_in']) // Redirect