ie «срок действия веб-страницы истек» на кнопке возврата Проблема с сеансом PHP

#php #internet-explorer #session

#php #internet-explorer #сессия

Вопрос:

В IE, когда пользователь нажимает кнопку «Назад», они получают классическое сообщение IE «срок действия веб-страницы истек».

Я обнаружил, что установка следующего в моем php.ini решила эту проблему.

 'session.cache_limiter=private'
  

Однако моя проблема сейчас в том, что при отправке форм я включаю значение сеанса PHP ($ _SESSION [‘token’]) в скрытое поле. Затем я проверяю это на следующей странице, чтобы увидеть, совпадают ли значения токенов

 echo "<form ......<input type='hidden' name='token' value='".$_SESSION['token']."' />";

/*on recieving page*/
if($_POST['token']==$_SESSION['token']){/*ok matched*/}
else{/*THIS IS WHERE THE ERROR OCCURS*/}
  

Моя проблема в том, что с момента добавления этого параметра в мой файл php.ini я заметил, что при отправке форм я получаю ошибку моей пользовательской страницы, поскольку по какой-то причине значение $ _SESSION [‘token’], похоже, изменяется на странице, получающей данные формы, что приводит к тому, что оператор if () возвращает false? Это происходит во всех браузерах сейчас?

Вот мой код $ _SESSION [‘token’] (Обратите внимание, что при отправке моей формы он попадает в else (), но изменяется значение $ _SESSION [‘token’], что-то связанное с кешем, возможно, не сохраняющим мои значения $ _SESSION?

 session_start()
if(!isset($_SESSION['token']))
{
            $token = md5(uniqid(rand(), TRUE));
            $_SESSION['token'] = $token; /*have to put current session token into this variable for hidden field in <form>*/
            $_SESSION['token_time'] = time();
}
else
{
            /*if token set ie user press back button on browser*/
            $token_age = time() - $_SESSION['token_time'];
            if ($token_age > 1200)
            {
                        /* More than 20 minutes has passed - regenerate. Do this so more likely wont timeout when user taking long time on <form> and token may not get refreshed before time limit*/
                        $token = md5(uniqid(rand(), TRUE));
                        $_SESSION['token'] = $token; /*have to put current session token into this variable for hidden field in <form>*/
                        $_SESSION['token_time'] = time();
            }

}
  

Если таковые имеются, используйте мои другие настройки сеанса php.ini

 session.cache_limiter=private
session.cookie_secure=1 ;my wholes site is SSL
session.cookie_httponly=1
session.save_path = /tmp ;directory to store sessions
session.save_handler = files
session.cookie_lifetime = 0 ;persistence cookie dies after browser closed
session.use_trans_sid = 0
session.use_only_cookies=1
  

Позвольте мне просто кое-что прояснить, ребята, причина, по которой возникает вся эта проблема, заключается в использовании ‘session.cache_limiter = private’. Если я удалю это, проблем не возникнет, за исключением того, что при нажатии кнопки «Назад» на странице формы я получаю сообщение «Срок действия веб-страницы истек» в IE. Есть ли какие-либо предложения, как избежать появления этого сообщения в IE при нажатии кнопки «Назад»?

Комментарии:

1. Как насчет наблюдения за вашим $ token_age?

2. Вы используете session.cookie_secure=1 . Находится ли ваш сайт на защищенном сервере (https) ? Попробуйте отключить это?

3. Да, у меня есть, но это не входит в это if (). Просто в else (). это как-то связано с этой настройкой session.cache_limiter = private поскольку без этого это работает, но я получаю «сообщение об истечении срока действия веб-страницы» в IE, если я его удаляю. Я что-то упускаю, я думаю, поскольку кэш, похоже, уничтожается на каждой странице. Я думаю, что-то связано с session.cache_expire?

4. Весь мой сайт — SSL, теперь упоминал об этом в предыдущем вопросе.

5. Вы проверили заголовки HTTP?

Ответ №1:

ini_set(«session.cache_limiter», «необходимо выполнить повторную проверку»);

Комментарии:

1. Могу ли я указать это в моем php.ini как ‘session.cache_limiter =must-revalidate’ или это должно быть в PHP-скрипте с использованием ini_set () ?

2. Это поддерживаемый вариант? php.net/manual/en/function.session-cache-limiter.php

3. Только что попробовал ini_set (‘session.cache_limiter’, ‘must-revalidate’); в моем PHP-коде это вызывает ту же проблему

4. Спасибо, что это сработало, ребята, используя ini_set («session.cache_limiter», «must-revalidate»); заменил ‘ на » и выполнил задание. Как я могу поместить это в свой файл php.ini сейчас, и это лучший ответ?

5. ‘session.cache_limiter =необходимо выполнить повторную проверку’

Ответ №2:

Это в HTML-коде?

 <input type='hidden' name='token' value='".$_SESSION['token']."' />
  

Если да, попробуйте:

 <input type='hidden' name='token' value='<?PHP echo $_SESSION['token']; ?>' />
  

🙂


Я никогда не был слишком доволен встроенной функциональностью сеанса PHP. Слишком много проблем для меня…

Вы инициализируете обработку сеанса с помощью session_start() ?

Вы уверены, что в сеансах используются файлы cookie, а не какие-либо поля строки запроса / POST? (Проверьте сгенерированный HTML-код в браузере).

Комментарии:

1. да, я использую session_start () забыл вставить это в предоставленный мной код, я исправил свой предыдущий вопрос, добавил еще несколько настроек, которые могут вызывать проблемы?

2. Нет, я, очевидно, повторяю HTML <form> в PHP, снова изменил предыдущий код вопроса.

3. это как-то связано с этой настройкой session.cache_limiter = private поскольку без этого он работает, но я получаю «сообщение об истечении срока действия веб-страницы» в IE, если я его удаляю. Я что-то упускаю, я думаю, поскольку кэш, похоже, уничтожается на каждой странице. Я думаю, что-то связано с session.cache_expire?