Настроить функцию выхода из системы, чтобы справиться с проблемой возврата сафари

У меня есть следующая функция logout(), которая работает на большинстве браузеров, но не на сафари. Проблема в сафари после выхода из системы, если пользователь нажимает кнопку "Назад", они получают предыдущую страницу из кеша вместо экрана входа в систему. Есть ли способ отрегулировать функцию выхода из системы, чтобы справиться с этим?

function logout()
{   
    // unset any session variables
    $_SESSION = [];

    // expire cookie
    if (!empty($_COOKIE[session_name()]))
    {
       // setcookie(session_name(), "", time() - 42000);
       $params = session_get_cookie_params();            
       setcookie(session_name(), '', time() - 42000,
                 $params["path"], $params["domain"],
                 $params["secure"], $params["httponly"]);
    }

    // destroy session
    session_destroy();        
}

Ответ 1

Мне кажется, что проблема с браузером больше, чем проблема с сервером.

Вы можете попробовать это решение, которое в основном помещает этот javascript на ваши зарегистрированные страницы:

window.onpageshow = function(event) {
    if (event.persisted) {
        window.location.reload() ;
    }
};

Чтобы перезагрузить страницу после выхода из системы, вы можете проверить, нет ли файла cookie, так что кнопка "Назад" все еще работает при входе в систему, например. Просто измените строку "yourCookieName" на ваше имя cookie сеанса.

function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1);
        if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
    }
    return null;
}

function hasCookie(cname) {
     return getCookie(cname) !== null;
}

window.onpageshow = function(event) {
    if (event.persisted && !hasCookie("yourCookieName")) {
        window.location.reload(); // or redirect to login page
    }
};

Примечание. Я думаю, что кеш-память будет по-прежнему существовать в Safari с решением 2. Таким образом, на мой взгляд это не очень эффективное решение, обеспечивающее правильную безопасность.

Ответ 2

Используйте функцию переадресации в своем коде, например

function logout()
{   
    // unset any session variables
    $_SESSION = [];


    // expire cookie
    if (!empty($_COOKIE[session_name()]))
    {
       // setcookie(session_name(), "", time() - 42000);
       $params = session_get_cookie_params();            
       setcookie(session_name(), '', time() - 42000,
                 $params["path"], $params["domain"],
                 $params["secure"], $params["httponly"]);
    }

// to redirect the user to login page

$return_url = "login.php"; //I'm using login.php you can change it according to your page

// destroy session
session_unset();
session_destroy();

header('Location:'.$return_url); //to redirect to user
}

А также использовать, чтобы проверить, что сеанс пользователя существует или нет,

session_start();
if($_SESSION[name]=="") {
header("location:index.php");
}

Примечание. Необходимо, чтобы на всех страницах выполнялась аутентификация пользователя для доступа к страница, если есть только сеанс