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

时间:2015-07-06 11:50:08

标签: php cookies

我有一个简单的网站,您只需要一个密码即可访问内容。然后有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)上,即使我直接注销,也会出现重定向问题。

将不胜感激任何帮助, 即

1 个答案:

答案 0 :(得分:2)

您认为不同的重定向问题背后有不同的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