0

PHP を使用して描画されたページを含む動的な Web サイトがあります。

$_GET 変数を使用して、ユーザーからコマンドを取得し、$_GET コマンドに基づいて PHP を実行し、ページを描画しています。

ただし、ユーザーが戻るボタンを押すと、コードを再実行する代わりに、以前に動的に描画されたページが表示されるようにします。

私はこれが行われるのを見てきましたが、それを行う方法がわかりません。

たとえば、次のコードを想定します。

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

URL: somepage.php?cmd=time をクリックするとコードは正しく実行されますが、戻るボタンを使用するとコードが再実行されます。再実行する代わりに、ページが描画されたときの時間をユーザーが確認できるようにする、キャッシュまたは私が知らない何かを使用する方法はありますか?

================================================== ===================================== もう少し具体的にするために、ページ私が話しているコードは、複数の機能を実行し、指定されたコマンドに基づいて MySQL データを変更し、ページを描画します。

戻るボタンを使用するときに、再実行せずに最初に動的に描画されたページを表示する方法があるかどうかを知りたいです。

4

3 に答える 3

0

HTTP キャッシュ ヘッダーを使用する必要があります。次の 3 つの戦略があります。

  • 有効期限
  • 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ヘッダーが提供されます。次にブラウザーがページにIf-None-Matchアクセスすると、以前の ETag 値を含む HTTP 要求ヘッダーが送信されます。サーバーは、このヘッダーを現在の ETag と比較する必要があります。それらが同じである場合、サーバーは空の本文と304 Not Modifiedステータスのみを送信する必要があります。ETag は、ページのコンテンツとバージョンを一意の方法で識別するものであれば何でもかまいません。

Last Modification は ETag と同様に機能しますが、サーバー生成タグの代わりに日付を使用します。日付の比較は、前後の日付も考慮して行う必要があります。

HTTP 仕様のセクション 13 は、これらすべてのメカニズムとその落とし穴をカバーしています。読むのは難しいですが、それだけの価値があります。

于 2012-04-25T15:09:14.367 に答える
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 に答える