#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?