web-dev-qa-db-ja.com

クリアキャッシュを含むwindow.location.reload

JavaScriptを使用してページをリロードしたいのですが、キャッシュもクリアしたいので、ページを更新すると、サーバーからのすべての最新バージョンがページに表示されます。
IE以外の他のブラウザは最新のコンテンツを取得していません。

IE9のための任意の解決策?

126
coure2011

reload()は、ハードリロードを行うように指示する引数を受け取ることになっています。つまり、キャッシュを無視します。

location.reload(true);

私はその信頼性を保証することはできません、あなたはこれをさらに調査することを望むかもしれません。

199
Christian

いくつかの方法があります。 1つ目は、このメタタグをheadに追加するだけです。

<meta http-equiv="Cache-control" content="no-cache">

ドキュメントをキャッシュから削除したい場合、expiresメタタグは、そのcontent属性を-1に設定することによって削除するように動作します。

<meta http-equiv="Expires" content="-1">

http://www.metatags.org/meta_http_equiv_cache_control

また、IEからメインページの最新のコンテンツを入手できます。 CSSやJSのような外部ドキュメントに問題がある場合は、URLの末尾に現在のミリ秒単位の時間でダミーのパラメータを追加して、同じにならないようにします。このようにして、IEや他のブラウザは 常に あなたに最新バージョンを提供するでしょう。これが一例です。

<script src="mysite.com/js/myscript.js?12345">

UPDATE 1

コメントを読んだ後、私はあなたがプログラム的に毎回ではなくキャッシュを消去したかったと思います。あなたができることはJSのような関数を持つことです:

eraseCache(){
  window.location = window.location.href+'?eraseCache=true';
}

それでは、PHPでは、次のようにします。

<head>
<?php
    if (isset($_GET['eraseCache'])) {
        echo '<meta http-equiv="Cache-control" content="no-cache">';
        echo '<meta http-equiv="Expires" content="-1">';
        $cache = '?' . time();
    }
?>
<!-- ... other head HTML -->
<script src="mysite.com/js/script.js<?= $cache ?>"
</head>

これはテストされていませんが、うまくいくはずです。基本的に、あなたのJS関数は、呼び出されるとページをリロードしますが、URLの最後にGETパラメータを追加します。あなたのサイトはこのパラメータを探すバックエンドコードを持っているでしょう。存在する場合は、メタタグとタイムスタンプを含むキャッシュ変数を追加し、それをキャッシュの問題があるスクリプトとCSSに追加します。

アップデート2

メタタグは確かにキャッシュを消去しません ページロード時 。そのため、技術的にはJSでeraseCache関数を実行する必要があります。ページがロードされたら、変更を反映させるために 再度 をロードする必要があります。サーバー側の言語でこれを修正できるはずです。同じ eraseCache JS関数を実行することもできますが、メタタグを追加する代わりに、HTTP Cacheヘッダーを追加する必要があります。

<?php
    header("Cache-Control: no-cache, must-revalidate");
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
?>
<!-- Here you'd start your page... -->

このメソッドは、ページがロードされる前および実行される前にキャッシュを消去するため、ページの再ロードを必要とせずにすぐに機能します。

52
Oscar Godson

私はこの問題を抱えていたし、私はJavaScriptを使用してそれを解決しました

 location.reload(true);

あなたも使用することがあります

window.history.forward(1);

ユーザーがアプリケーションからログアウトした後にブラウザの戻るボタンを停止します。

6
yousef

私の場合、asp.netが動作を制御しているのでreload()は動作しません。それで、この問題を解決するために、私はこのアプローチを使用しました。

self.clear = function () {
    //location.reload(true); Doesn't work to IE neither Firefox;
    //also, hash tags must be removed or no postback will occur.
    window.location.href = window.location.href.replace(/#.*$/, '');
};
4
Rodrigo

私はこのJavaScriptスクリプトを書き、それをヘッダに含めました(何でもロードする前に)。うまくいくようです。ページが1時間以上前にロードされた場合、または状況が未定義の場合は、サーバーからすべてのものが再ロードされます。 1時間= 3600000ミリ秒は、次の行で変更できます。if(alter> 3600000)

に関しては、Birke

<script type="text/javascript">
//<![CDATA[
function zeit()
{
    if(document.cookie)
    {
        a = document.cookie;
        cookiewert = "";
        while(a.length > 0)
        {
            cookiename = a.substring(0,a.indexOf('='));
            if(cookiename == "zeitstempel")
            {
                cookiewert = a.substring(a.indexOf('=')+1,a.indexOf(';'));
                break;
            }
            a = a.substring(a.indexOf(cookiewert)+cookiewert.length+1,a.length);
        }
        if(cookiewert.length > 0)
        {
            alter = new Date().getTime() - cookiewert;

            if(alter > 3600000)
            {   
                document.cookie = "zeitstempel=" + new Date().getTime() + ";";
                location.reload(true);
            }
            else
            {
                return;
            }
        }
        else
        {
            document.cookie = "zeitstempel=" + new Date().getTime() + ";";
            location.reload(true);
        }
    }
    else
    {
        document.cookie = "zeitstempel=" + new Date().getTime() + ";";
        location.reload(true);
    }
}
zeit();
//]]>
</script>
4
Birke