【问题标题】:Too many redirects - cookies JS + php implementation重定向太多 - cookie JS + php 实现
【发布时间】:2015-09-23 13:20:54
【问题描述】:

我有一个简单的网站,您只需要密码即可访问内容。然后有 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.

【问题讨论】:

标签: php cookies


【解决方案1】:

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

如果索引页面中的isset($_COOKIE['m_username']) 为真,那么您将被重定向到个人页面,如果if (!(isset($_SESSION['login']) &amp;&amp; $_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

【讨论】:

  • 我认为这与我目前试图实现的目标不符 - 如果你能证明我错了,我将不胜感激 :) 我想将这 3 个变量存储在 cookie 中 5 天,所以每次用户在这段时间内打开网站,他们不会去登录页面,而是直接进入内容页面。我不认为可以这样做,因为一旦关闭浏览器,会话就会关闭。
  • 你是对的。此页面概述了可用于修改 PHP 会话行为的方法:php.net/manual/en/book.session.php。查看 session_set_cookie_params,尤其是生命周期参数。
  • 使用了 session_set_cookie_params,一切都很完美!干杯:)
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2020-03-24
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
相关资源
最近更新 更多