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