用户按下后退按钮时不重绘页面(在PHP中使用$ _GET变量)

时间:2012-04-25 14:48:27

标签: php caching button dynamic back

我有一个动态网站,页面使用PHP绘制。

使用$ _GET变量我从用户那里获取命令,根据$ _GET命令执行PHP,并绘制页面。

但是,当用户按下后退按钮时,我希望他们看到之前为它们动态绘制的页面,而不是重新执行代码。

我已经看到了这一点,但无法弄清楚如何做到这一点。

例如假设以下代码:

if ($_GET['cmd'] == "time") {
   echo "The current Unix timestamp is: " . time;
}

单击url:somepage.php?cmd = time会正确执行代码,但在使用后退按钮时,请重新执行代码。有没有办法使用缓存或其他我不知道的东西,这将允许用户查看绘制页面时的时间,而不是重新执行?

=============================================== ========================================== 为了尝试更具体一点,我所谈论的页面和代码执行多个功能,并根据给定的命令更改MySQL数据,然后绘制页面。

我想知道在使用后退按钮时是否有办法不重新执行,而只是显示第一次动态绘制的页面。

3 个答案:

答案 0 :(得分:0)

我不确定这是否是您正在寻找的,但它可能会有所帮助。您可以使用ajax,然后实现:http://www.nerdswithlives.com/2010/03/yui-ajax-browser-history-back-button.html

,而不是使用php get

每次执行特定的get命令时,您也可以存储某种类型的变量,然后检查该变量以确定在页面加载时重绘哪些内容。

修改

从更多地考虑你的问题,我相信答案在于使用PHP Sessions,并在客户端机器上存储数据。当用户点击“返回”时,他/她将进入缓存页面...因此缓存不是您的答案。你需要以特定的方式重新绘制它,但因为你正在使用GET,所以浏览器不会缓存这个...至少使用后退按钮功能。你的答案是在这个动态内容存在的每个页面上开始一个会话,存储一个像$_SESSION['sessionVar'] = 1;之类的变量。然后根据该页面上绘制的内容动态更改变量。然后,当用户单击“返回”时,您可以检查该变量是什么,然后再次获取数据。摆脱使用缓存的心态 - 您需要重新绘制用户之前看到的任何数据。在这种情况下,会话很有用。

答案 1 :(得分:0)

您可以查看使用$_SESSION

if ($_GET['cmd'] == "time") {
   $_SESSION['time'] = isset($_SESSION['time']) ? $_SESSION['time'] : time;
   echo "The current Unix timestamp is: " . $_SESSION['time'];
}

答案 2 :(得分:0)

您应该使用HTTP缓存标头。有三种策略:

  • 过期时间
  • ETag的
  • 上次修改时间

第一个设置页面过期的日期/时间。这可以通过发送标题来实现:

header('Expires: Thu, 28 Apr 2012 16:00:00 GMT');

此方法的主要问题是您无法使此缓存无效。这意味着,如果您想要重绘所有内容以更新页面上的内容,那么您将不得不等待缓存过期。

ETag有更好的控制权,但更难实施:

$etag = md5($pageId);
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) 
    && false !== stripos($_SERVER['HTTP_IF_NONE_MATCH'], $etag)) {
    header('HTTP/1.1 304 Not Modified');
    die;
} else {
    header('ETag: '.$etag);
    //draw the page
}

当浏览器第一次点击该页面时,将绘制该页面并提供ETag标题。下次浏览器点击页面时,它将发送带有先前ETag值的HTTP请求标头If-None-Match。服务器必须将此标头与当前ETag进行比较,如果它们相同,则服务器只需要发送空体和304 Not Modified状态。 ETag可以是以独特方式识别页面内容和版本的任何内容。

Last Modification与ETag类似,但它使用日期而不是服务器生成的标记。日期比较也必须考虑到后期和之前的日期。

Section 13 of the HTTP specification涵盖所有这些机制及其陷阱。这是一个难以阅读,但它是值得的。