【问题标题】:ie "webpage has expired" on back button PHP session problem即后退按钮PHP会话问题上的“网页已过期”
【发布时间】: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


【解决方案1】:

ini_set("session.cache_limiter", "must-revalidate");

【讨论】:

  • 我可以像 'session.cache_limiter=must-revalidate' 一样把它放在我的 php.ini 中,还是必须使用 ini_set() 在 PHP 脚本中?
  • 刚试过ini_set('session.cache_limiter', 'must-revalidate');在我的 PHP 代码中导致了同样的问题
  • 感谢使用 ini_set("session.cache_limiter", "must-revalidate");将 ' 替换为 " 并完成了这项工作。我现在如何将它放在我的 php.ini 文件中,这是最好的答案?
  • 'session.cache_limiter=must-revalidate'
【解决方案2】:

这是在 HTML 代码中吗?

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

如果是,请尝试:

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

:)


我对 PHP 内置的会话功能从来都不满意。我的问题太多了...

您是否正在使用session_start() 初始化会话处理?

您确定会话使用的是 cookie - 而不是任何 Query-String / POST 字段吗? (在浏览器中查看生成的 HTML 代码)。

【讨论】:

  • 是的,我确实使用 session_start() 忘记将其粘贴到我提供的代码中,我已经修改了我之前的问题,添加了一些可能导致问题的设置?
  • 不,我显然是在回应 HTML
    在 PHP 中再次修改了之前的问题代码。
  • 这与设置 session.cache_limiter=private 有关,因为没有它它可以工作,但如果我把它拿出来,我会在 IE 中收到“网页过期消息”。我错过了一些我认为缓存似乎在每一页上都被清除的东西。我认为与 session.cache_expire 有关?
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2011-08-31
相关资源
最近更新 更多