8

そのため、プロジェクトのリリースを毎週行っていますが、クライアントが特定のファイルの古いバージョンを持っているという問題に直面しています。

スタックは、バックボーン ボイラープレートを備えた requirejs と PHP バックエンドを備えた Apache2 サーバーを備えたバックボーンです。

読み込まれるインデックス html ファイル、AJAX を使用して読み込まれるテンプレート HTML ファイル、そしてすべての js ファイルがあります。

この質問はhttps://stackoverflow.com/questions/12103341/backbone-boilerplate-disable-cachingに関連しているようですが、良い答えが見つかりませんでした。

キャッシュ制御ヘッダーと mod の有効期限が切れ、PHP の mod ヘッダーが役立つかもしれないと聞いたことがありますが、それらをすべてまとめる方法がわかりません。

基本的に、私たちがやりたいことは、prod サーバーへの新しいコードのリリース時に、すべてが少なくとも一度はキャッシュされないようにすることです。その後、ロード速度を上げるための通常のキャッシュが理想的です。

少なくとも、これらのものがキャッシュされるのを完全に防ぐ方法を理解しようとは思いません。

何か案は?

4

5 に答える 5

6

キャッシングに関する限り、ユーザー クライアントのブラウザを制御するのは難しいことがわかりました。私が過去に使ったトリックの 1 つは、JS ファイルの URL に乱数を追加することです。お気に入り

<script src="https://www.mydomain.com/myjsfile.js?123456789"></script>

また

<script src="https://www.mydomain.com/myjsfile.js?releaseID=123456789"></script>

これにより、クライアントはそれを完全に新しいファイルとして扱います。各リリースに乱数を割り当てると、ユーザーのブラウザーが新しい JS ファイルを再度プルするようになります。同じことがCSSにも当てはまります。

これが役立つことを願っています。幸運を。

于 2012-10-19T19:48:54.993 に答える
5

<head>クライアント側でのファイルのキャッシュは、呼び出されたhtmlファイルの-セクションのメタ情報とHTTPヘッダーの2つの値によって定義されます。

HTMLファイルでは、2つのメタタグ cache-controlexpires指定し、簡単なphpコマンドを指定して毎週の有効期限を定義できます。

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="PRIVATE">
<?php
    $daysDelta = 7-date("w");
    $expiration = date(DATE_RFC1123, mktime(0, 0, 0, date("m"), 
        date("d")+$daysDelta+1, date("Y")));
?>
<META HTTP-EQUIV="EXPIRES" CONTENT="<?= $expiration ?>">

これにより、月曜日の朝にキャッシュが強制終了されます。別の方法は、 HTTPヘッダーを介したキャッシュ設定です。

<?php
    header("Cache-Control: private");
    header("Expires: <?= $expiration ?>");
?>

両方の方法を使用すると、平日はキャッシュがありますが、週末が過ぎると、クライアントはキャッシュを無効にしてデータを再プルします。

于 2012-10-25T12:54:36.507 に答える
5

requirejsには、すべてのrequirejs リクエストにパラメーターを追加する urlargsというパラメーターがあり、キャッシュの更新を強制するために使用できます。このページの例ではタイムスタンプを使用していますが、ビルド バージョンを探している可能性があります。

ただし、r.js を使用してスクリプトの製品版をビルドする必要があります (require でロードされたすべてのファイルをコンパイルおよび縮小し、1 つのライブラリを生成します)。これにより、ロード時間が短縮され、多くの心配がなくなります。この 1 つのライブラリだけをリンクし、ファイル名自体にビルド バージョンを含めます (backbone.app.1.0.23456.js など)。

于 2012-10-26T14:54:45.660 に答える
5

ページからキャッシュを削除するには、ページの上部にこれを含める必要があります:-

$this->output->set_header("Expires: Tue, 01 Jan 2000 00:00:00 GMT"); 
$this->output->set_header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
$this->output->set_header("Cache-Control: post-check=0, pre-check=0", false); 
$this->output->set_header("Pragma: no-cache");
于 2012-10-26T06:01:58.210 に答える
0

URIに乱数を追加すると、クライアントのキャッシュが中断されます。
代わりに、ファイルの最終変更時刻を追加してください。

<script src="myjsfile.<?=filemtime('myjsfile.js')?>.js"></script>

必要な処理と.htaccessルール(次のような)

RewriteRule ([^/]*)\.[0-9]*\.css$ $1.css [L,NC]

さらに、.htaccessに長期キャッシュ命令を提供します

<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType text/css                  "access plus 1 year"
  ExpiresByType application/javascript    "access plus 1 year"
</IfModule>
于 2012-10-30T11:45:31.993 に答える