【发布时间】:2011-06-02 10:54:59
【问题描述】:
在 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 中出现该消息?
【问题讨论】:
-
观察你的 $token_age 怎么样?
-
您正在使用
session.cookie_secure=1。您的网站在secure (https) server 上吗?试试把那个关掉? -
是的,我有,但它没有进入 if()。就在 else() 中。它与设置 session.cache_limiter=private 有关,因为没有它它可以工作,但如果我把它拿出来,我会在 IE 中得到“网页过期消息”。我错过了一些我认为缓存似乎在每一页上都被清除的东西。我认为与 session.cache_expire 有关?
-
我的整个网站都是SSL,现在已经在上一个问题中提到了。
-
你检查过HTTP头吗?
标签: php internet-explorer session