5

ブラウザのキャッシュが Laravel アプリケーションに干渉しているという問題があります。

ブラウザのキャッシュが無効になっている場合、すべて正常に動作します。ただし、有効にした場合、同じリンクが繰り返しクリックされると、ビューを作成したりデータを収集したりする Laravel メソッドは実行されません。

その影響は多岐にわたります。たとえば、(ajax を使用してサーバーからロードされた) データを表示するリソースまたはグリッドを編集するためのフォームは、ブラウザーがリロードされるまで現在の値を表示しません。

これを証明するために、現在のタイムスタンプをログに記録するいくつかのメソッドに行を入れました。

public function index()
{
    Log::info( microtime() );

    return View::make( $this->templates_root . 'index' );
}

リンクを繰り返しクリックしたり、ビューに再度アクセスしたりしても、ログに行が表示されません。しかし、ブラウザをリロードするとそうなります。

ブラウザーがビューをキャッシュしないようにするにはどうすればよいですか?

4

1 に答える 1

6

編集:

驚き、驚き - 以前のソリューションは IE では機能しませんでした。

さらに数時間を費やした後、bladeテンプレート ヘッダーに以下を追加することになりました。

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="cache-control" content="no-store" />
<meta http-equiv="cache-control" content="must-revalidate" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

これはすべてのブラウザで機能するようです。

さらに、すべての AJAX 呼び出しのキャッシュを防止する必要がありました。この質問は、非常に役立つ回答を提供してくれました。

以下は IE では機能しません。

私は解決策を見つけました - 私の意見ではかなりのものではありません。

次のように(グローバルアフター)フィルターを使用すると...

App::after(function($request, $response)
{
    // prevent browser caching
    $response->headers->set('Cache-Control','nocache, no-store, max-age=0, must-revalidate');
    $response->headers->set('Pragma','no-cache');
    $response->headers->set('Expires','Fri, 01 Jan 1990 00:00:00 GMT');
});

ブラウザがサーバーからページをリロードするように強制しているようです。

この質問への回答は、非常に有益な情報を提供してくれました。

しかし、他の開発者が同じ問題を抱えていないのはなぜなのか、もしそうなら、どうやってそれを解決しているのか、私はまだ疑問に思っています。

于 2013-09-27T10:22:24.457 に答える