web-dev-qa-db-ja.com

JavaScriptを使用してChromeでページのリロードを強制します[キャッシュなし]

JavaScriptを使用してページをリロードし、ブラウザーのキャッシュからプルしないで、代わりにサーバーからページをリロードする必要があります。 [ページの要素は暫定的に変更されるため]

IEとFFでは、次のコードが正常に機能することがわかりました。

_window.location.reload(true);
_

ただし、ChromeまたはSafariでは機能しません。

私は次のことを試しましたが、役に立ちませんでした。

_window.location.replace(location.href);
document.location.reload(true);
document.location.replace(location.href);
_

この問題の解決策はありますか?

調査結果

これを調べたところ、この問題はHTTPプロトコルの処理であることがわかりました。

  1. Chromeは_Pragma: no-cache_ HTTPフィールドを含むリクエストを送信します
  2. サーバーは_Last-Modified: DATE1_フィールドで応答します
  3. JSはlocation.reload(true)を使用して、キャッシュではなくサーバーからのリロードを強制します
  4. Chromeは_If-Modified-Since: DATE1_フィールドを含むリクエストを送信します
  5. サーバーは_HTTP Status 304 Not Modified_で応答します

サーバーアプリケーションは、動的なページコンテンツの状態の変化に気付かず、_200_を返さないのが原因です。ただし、JS location.reload(true)が呼び出されたときに_If-Modified-Since_フィールドを送信する唯一のブラウザはChrome/WebKitです。

他の誰かが同じ問題に遭遇した場合に備えて、ここに私の調査結果を入れようと思いました。

21
graney

あなたはこのハックを使うことができます:

 $.ajax({
        url: window.location.href,
        headers: {
            "Pragma": "no-cache",
            "Expires": -1,
            "Cache-Control": "no-cache"
        }
    }).done(function () {
        window.location.reload(true);
    });
10
Suhan

ページがキャッシュから読み込まれないようにするには、クエリに一意の番号を追加します。

window.location = location.href + '?upd=' + 123456;

123456の代わりに日付を使用することもできます

6
m03geek

素晴らしい発見!私は同じ問題に遭遇しましたが、これは本当に役に立ちます!ただし、検索結果に加えて、Chromeは常にlocation.reload()のGETリクエストを送信します... IE/FFが最後のリクエストを繰り返しています。

1
Roy Ling

これは、私のアプリケーションファイルがChromeに強制的にリロードされるようにするために行うことです。

    var oAjax = new XMLHttpRequest;
    oAjax.open( 'get', '/path/to/my/app.js' );
    oAjax.setRequestHeader( 'Pragma', 'no-cache' );
    oAjax.send();
    oAjax.onreadystatechange = function() {
        if( oAjax.readyState === 4 ) {
            self.location.reload();
        }
    }
1
Juergen Riemer

window.location = window.locationをお試しください

0
TW147