1

Javascript でページをリロードする必要があります。window.location.reloadその目的で使用しています。現在、Chrome で奇妙な動作が見られます。Chrome は常にサーバーに接続し、ドキュメントが変更されたかどうかを尋ねます。a304 Not Modifiedが返されますが、回避したいサーバーへのラウンドトリップがまだあります。

また、クロムにキャッシュを使用するように明示的に使用しようとしましwindow.location.reload(false)たが、成功しませんでした。リロードした URL にアクティブなハッシュ (#) フラグメントがあるわけではありません。

リソースの応答ヘッダーは次のとおりです。

HTTP/1.1 304 Not Modified
Server: nginx/1.2.2
Date: Sat, 01 Jun 2013 13:19:56 GMT
Last-Modified: Sat, 01 Jun 2013 13:04:55 GMT
Connection: keep-alive
Expires: Sun, 02 Jun 2013 13:19:56 GMT
Cache-Control: max-age=86400
Access-Control-Allow-Origin: *

したがって、Cache-ControlExpiresヘッダーの両方が設定され、24 時間以内にリソースを更新しないように chrome に指示する必要があります。

F5/CMD+R を使用してページをリロードしませんが、代わりにリンクをクリックすると、変更さwindow.location.hashれてから呼び出される JavaScript イベントが含まれますwindow.location.reload(false)。しかし、Chrome はCache-Control: max-age=0リクエストのヘッダーを設定し続けます。これは望ましくありません。Chrome は内部キャッシュを使用し、サーバーには何も送信しないでください。

Firefox を使用した同じコードで問題はありません。FF はサーバーにまったく接続せずにキャッシュされたバージョンを使用します。

どうすればこれを修正できますか?

編集: これは、自分で試すために使用できる簡単な例です: http://webspace.markdown.io/reloadtest.html

編集:開発者ツールを閉じて、サーバー上でヘッダーを確認しtcpdump -s 1024 -l -A dst port 80ます。また、開発者ツールで「ブラウザのキャッシュを無効にする」のチェックを外しました。

編集 2: タブを閉じて URL を新しいものに入力すると、Chrome はキャッシュを正しく使用することに注意してください。リンクをクリックするだけです (window.location.reload影響を受ける.

4

4 に答える 4

3

さらに調査した後、自分自身に答えます:

それは単にできません。

この問題はhash値とはまったく関係がなく、ハッシュを使用しない場合でも発生します。

現在のリソース ( で示される) をキャッシュから使用window.location.reload()するかどうかを制御するために使用することはできないようです。MDNwindow.location.hrefのドキュメントでは別の方法が提案されていますが。オブジェクト内のオブジェクトに関する公式の W3C 仕様もあまり役に立ちません。Locationwindow

Chrome と Firefox は、渡したパラメータに関係なく、常にサーバーへのラウンドトリップを実行し、現在のリソースを要求します.reload()。パラメータは元々、リクエストを強制的にPOSTリクエストとして繰り返すために導入されましたGET- これはキャッシングとは関係ありません。(Firebug を使用するときは注意してください: Firebug には表示されないため、最初は FF は要求を送信しないと考えていましたが、Web サーバーのログを見ると、実際に送信されていることがわかります)。

boolean パラメーターの存在が、ブラウザーが要求Cache-Control: max-age=0に ヘッダーを追加するかどうかに影響することがわかります。ただし、これは転送されるデータを減らすだけであり、サーバー接続がまったくなくなるわけではありません。いずれの場合も往復が行われます。

于 2013-06-11T20:34:54.703 に答える
1

最新のHTML5 ドラフト(変更なしで最終的な HTML5 標準になる可能性が高い) では、location.reload()関数はブール値のパラメーターを取りません。したがって、HTML5 を対象とする場合、このパラメーターに依存するべきではありません。

于 2014-11-12T08:36:04.117 に答える
0

F5 または を使用してページをリロードするとwindow.location.reload、別のページからそのページに移動するとキャッシュが直接表示される場合でも、ネットワーク接続が確立されます。はreload(true)強制的にキャッシュをバイパスさせますが (200サーバーからではなくサーバーから取得します304)、サーバーreload(false)に接続する必要があるかどうかを判断する前にキャッシュを調べるようには強制しません。

ブラウザがページをリロードするためにキャッシュを調べず、フラグメントだけが異なるリンクをたどったときにページをリロードしない場合は、別のページを読み込んでいるとブラウザをだましてみてください。キャッシュ。これは ajax を使用して、既に見ているページを (キャッシュから) 取得し、ドキュメント全体を置き換えます。次に、URI フラグメントを新しいフラグメントに置き換えます。このようにフラグメントを変更すると、フラグメントの変更をリッスンする JavaScript フレームワークの関数がトリガーされます。

<html>
<head>
    <script src="http://code.jquery.com/jquery-1.8.1.min.js"></script>
</head>
<body>
    <p>
        It is: <span id="thetime"></span>
    </p>
    <a href="javascript: reload_page()">Reload</a>
    <script type="text/javascript">
        function reload_page() {
            var hash = new Date().getTime()
            $.get(window.location, function(data) {
                var newDoc = document.open("text/html", "replace");
                newDoc.write(data);
                newDoc.close();
                window.location.hash = new Date().getTime();
            });
        }
        document.getElementById('thetime').innerHTML = new Date().toISOString();
    </script>
</body>
</html>
于 2013-06-11T09:39:01.443 に答える