0

我有一个动态网站,其中包含使用 PHP 绘制的页面。

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

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

我已经看到这样做了,但不知道该怎么做。

例如假设以下代码:

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

单击 url: somepage.php?cmd=time 可以正确执行代码,但使用后退按钮时会重新执行代码。有没有一种方法使用缓存或其他我不知道的方法,可以让用户看到绘制页面时的时间,而不是重新执行?

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

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

4

3 回答 3

0

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

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

编辑

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

于 2012-04-25T14:53:54.263 回答
0

你可以看看使用$_SESSION

if ($_GET['cmd'] == "time") {
   $_SESSION['time'] = isset($_SESSION['time']) ? $_SESSION['time'] : time;
   echo "The current Unix timestamp is: " . $_SESSION['time'];
}
于 2012-04-25T15:04:21.083 回答
0

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

  • 过期时间
  • 电子标签
  • 上次修改时间

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

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标题。下次浏览器点击页面时,它会发送一个If-None-Match带有之前 ETag 值的 HTTP 请求头。服务器必须将此标头与当前的ETag进行比较,如果它们相同,则服务器只需要发送一个空的正文和一个304 Not Modified状态。ETag 可以是任何以独特方式标识页面内容和版本的东西。

Last Modification 的工作方式类似于 ETag,但它使用日期而不是服务器生成的标签。还必须考虑以后和以前的日期来进行日期比较。

HTTP 规范的第 13 节涵盖了所有这些机制及其陷阱。这是一个艰难的阅读,但它是值得的。

于 2012-04-25T15:09:14.367 回答