web-dev-qa-db-ja.com

githubページでは、ページの特定が古くなっています

Github pages 提供されるすべてのコンテンツに非常に積極的なキャッシュヘッダー(_Cache-Control: max-age=86400_ 1日、Expires 1か月先)を設定します。

ページを更新してgithubにプッシュすると、すでにキャッシュされたコピーを取得しているページに再度アクセスしたユーザーは、ブラウザのキャッシュを実際にクリーンアップしないと新しいページを取得できません。

ページで実行されているスクリプトは、どのようにしてページが古くなっていると判断し、強制的に更新することができますか?

手順は次のとおりです。

  1. githubページで実行していることを確認します:easy、_window.location_ for _github.com/_を解析します
  2. ページの現在のバージョンを判別します:hard、gitではsha1コミットされたページに埋め込むことができません。 RCSなし_$id$_。では、自分がどのバージョンであるかをどうやって知るのでしょうか?
  3. githubで現在のバージョンを取得します。 hard、githubは認証されていないv2APIを削除しました。また、githubにプッシュすることとgithubが公開に移行することの間には時間の隔たりがあります。では、どのバージョンを入手できるかをどうやって知るのでしょうか?
  4. 古くなっていると判断した場合、ページを無効にして強制的にリロードするにはどうすればよいですか? hardwindow.location.reload(true)はSafari/Chromeでは機能しません。

したがって、その解決-これらのステップ。もちろん、別の方法があるかもしれませんか?

41
Will

Webサイトのキャッシュをより適切に制御するには、HTML5キャッシュマニフェストを使用できます。見る:

window.applicationCache.swapCache() を使用すると、ページを手動で再読み込みしなくても、キャッシュされたバージョンのWebサイトを更新できます。

これは HTML5 Rocks のコード例で、ユーザーをサイトの最新バージョンに更新する方法を説明しています。

// Check if a new cache is available on page load.
window.addEventListener('load', function(e) {

  window.applicationCache.addEventListener('updateready', function(e) {
    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
      // Browser downloaded a new app cache.
      // Swap it in and reload the page to get the new hotness.
      window.applicationCache.swapCache();
      if (confirm('A new version of this site is available. Load it?')) {
        window.location.reload();
      }
    } else {
      // Manifest didn't changed. Nothing new to server.
    }
  }, false);

}, false);

混乱を避けるために、GitHubがcache.manifestファイルに正しいHTTPヘッダーを設定することを追加します。

Content-Type: text/cache-manifest
Cache-Control: max-age=0
Expires: [CURRENT TIME]

そのため、ブラウザはそれがキャッシュマニフェストであり、常に新しいバージョンをチェックする必要があることを認識しています。

37
rsp