PHP会话到期但页面刷新后我没有被重定向

时间:2013-10-21 08:21:42

标签: php .htaccess session model-view-controller

问题是,当我的会话到期时,我必须重新加载页面两次才能返回登录页面。 这是我的.htaccess文件

php_flag display_errors on
php_value error_reporting 9999

RewriteEngine On
Options -MultiViews
AddDefaultCharset UTF-8
php_value session.gc_maxlifetime 5
php_value session.gc_divisor 1
php_value session.gc_probability 1
php_value session.cookie_lifetime 5
php_value session.save_path /path/to/session/folder

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

我正在使用一些自定义MVC框架,我在控制器__construct函数中调用handleLogin()函数

function __construct() {
    parent::__construct();
    Auth::handleLogin();
}

最后这里是handleLogin()函数

public static function handleLogin() {
    @session_start();
    if (isset($_SESSION['loggedIn'])) {
        $logged = $_SESSION['loggedIn'];
    } else {
        session_destroy();
        header('location: ' . URL . 'login');
        exit;
    }
}

在会话到期后FIRST刷新后,我需要更改以将用户重定向到登录页面?

提前致谢!

P.S。我在Debian上运行它

更新:这是注销功能,它工作正常,当用户点击它时,他被立即重定向到登录页面

function logout()
{
    session_destroy;
    header('location: ' . URL .  'login');
    exit;
} 

更新#2我获得了一些屏幕截图,以便更好地解决问题

1)当会话处于活动状态且一切正常时 enter image description here

2)会话过期 - 用户点击链接或刷新页面(首次刷新后) 你可以注意到firebug登录已加载,但它没有显示 enter image description here

3)第二次刷新后 enter image description here

还有一件事是..当使用默认 php.ini设置(会话生命周期:1440秒)时,everthing工作正常,重定向没有问题

2 个答案:

答案 0 :(得分:0)

我认为您必须创建一个注销功能,您必须编写会话销毁然后重定向。因此,当用户单击他的注销链接时,您可以销毁他的会话变量,然后再次重定向到登录页面。

如果您使用ajax回调来销毁会话,那么您必须在javascript中刷新页面以将用户重定向到登录页面

答案 1 :(得分:0)

我找到了导致错误的原因,但我不确定为什么它会导致这样一个愚蠢的错误。 我的代码前面有session_set_cookie_params(0);,而我的浏览器一直打开,我更改了代码,删除了session_set_cookie_params(0);并添加了php_value session.gc_maxlifetime 5。这就是造成冲突的原因。一方预计会话持续到浏览器关闭,另一方在5秒后终止会话。我清理了100次缓存,直到我关闭浏览器并重新打开项目后才发生任何事情。