51

バックグラウンド:

  • IIS 7
  • AspNet3.5Webアプリ

Chrome開発ツールは、ウェブアプリのホームページ(aspx + js + css +画像)に対する98件のリクエストを一覧表示します。以下のリクエストでは、ステータスコードは200css/imagesファイル用です。キャッシュ情報はありません。ブラウザは、ファイルを更新する必要があるかどうかを毎回サーバーに確認します。わかった。

IIS 7では、キャッシュ制御用にHTTPヘッダーを設定し、「ressources」フォルダー用に6時間に設定しました。Chromeでは、開発ツールを使用して、ヘッダーが適切に設定されていることがわかります。

Cache-Control: max-age=21600

しかし、それでも98件のリクエストがあります...有効期限に達していない場合、ブラウザは1つのリソースをリクエストすべきではないと思い、リクエストの数が減ると予想していました...

4

8 に答える 8

106

わかった。同じタブで同じURIに別のリクエストを行った直後にリクエストを行った場合(更新ボタンをクリックするか、キーを押すか、 +を押す)、 GoogleChromeはCache-Controlorヘッダーを無視します。おそらく、ユーザーが本当にやりたいことを推測するアルゴリズムがあります。ExpiresF5CommandR

ヘッダーをテストする方法Cache-Controlは、それ自体へのリンクを含むHTMLドキュメントを返すことです。リンクをクリックすると、Chromeはキャッシュからドキュメントを提供します。たとえば、次のドキュメントにself.htmlという名前を付けます。

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Test Page</title>
</head>
<body>
    <p>
        <a href="self.html">Link to the same page.</a>
        If correctly cached, a request should not be made
        when clicking the link.
    </p>
</body>
</html>

別のオプションは、URLをコピーして、同じタブまたは別のタブに貼り付けることです。

更新2017年1月26日に公開されたChromeの投稿で、以前の動作と、サブリソースではなくメインリソースの再検証のみを行うことでどのように変化するかが説明されています:

ユーザーは通常、ページが壊れているか、コンテンツが古くなっているように見えるためにリロードします。既存のリロード動作は通常、壊れたページを解決しますが、特にモバイルでは、古いコンテンツは通常のリロードによって非効率的に対処されます。この機能は元々、壊れたページが非常に一般的だった時代に設計されたため、両方のユースケースに同時に対処することは合理的でした。ただし、Webページの品質が向上するにつれて、この当初の懸念は今でははるかに関連性が低くなっています。古いコンテンツのユースケースを改善するために、Chromeでは、メインリソースのみを検証し、通常のページの読み込みを続行するように、再読み込みの動作が簡素化されました。この新しい動作により、キャッシュされたリソースの再利用が最大化され、レイテンシ、消費電力、およびデータ使用量が削減されます。

同じく2017年1月26日に公開されたFacebookの投稿では、POSTリクエスト後にChromeがキャッシュされたすべてのリソースを無効にするコードが見つかったと述べられています。

Chromeは、POSTリクエストの作成から読み込まれたページ上のすべてのリソースを再検証することがわかりました。Chromeチームによると、POSTリクエストは、購入やメールの送信など、変更を加えるページである傾向があり、ユーザーは最新のページを希望するという理由があります。

これはもうそうではないようです。

最後に、FirefoxがCache-Control: immutableリソースの再検証を完全に停止するために導入していることが説明されています。

Firefoxは、このリソースを再検証してはならないことをブラウザに通知するために、一部のリソースに新しいキャッシュ制御ヘッダーを追加するというエンジニアの提案を実装しました。このヘッダーの背後にある考え方は、このリソースが最大使用期間中に変更されないことを開発者からブラウザーに約束することです。Firefoxは、このディレクティブをcache-control:不変ヘッダーの形式で実装することを選択しました。

これがリロードの謎を解くのに役立つことを願っています。

于 2013-02-12T21:54:23.520 に答える
21

Cache-Control同じタブでリロードしている場合、Chromeは設定を無視しているように見えます。URLを新しいタブにコピーしてそこに読み込むと、Chromeはキャッシュ制御タグを尊重し、キャッシュのコンテンツを再利用します。

例として、私はこのRubySinatraアプリを持っていました。

#!/usr/bin/env ruby

require 'sinatra'

before do
  content_type :txt
end

get '/' do
  headers "Cache-Control" => "public, must-revalidate, max-age=3600",
          "Expires" => Time.at(Time.now.to_i + (60 * 60)).to_s
  "This page rendered at #{Time.now}."
end

同じChromeタブで継続的にリロードすると、新しい時刻が表示されます。

This page rendered at 2014-10-08 13:36:46 -0400.
This page rendered at 2014-10-08 13:36:48 -0400.

ヘッダーは次のようになりました。

< HTTP/1.1 200 OK
< Content-Type: text/plain;charset=utf-8
< Cache-Control: public, must-revalidate, max-age=3600
< Expires: 2014-10-08 13:36:46 -0400
< Content-Length: 48
< X-Content-Type-Options: nosniff
< Connection: keep-alive
* Server thin is not blacklisted
< Server: thin

ただし、複数の新しいタブから同じURLにアクセスするとhttp://localhost:4567/、キャッシュからの以前の結果がリサイクルされます。

于 2014-10-08T17:44:31.437 に答える
18

でいくつかのテストを行った後Cache-Control:max-age=xxx

  • リロードボタンを押す:ヘッダーは無視されます
  • 任意のタブ(現在またはそうでない)で同じURLを入力:尊重
  • JS(window.location.reload())の使用:無視
  • 開発者ツール([キャッシュを無効にする]が選択されていない状態)またはシークレットモードを使用しても影響はありません

したがって、開発中の最良のオプションは、カーソルをオムニボックスに置き、更新ボタンの代わりにEnterキーを押すことです。

:更新アイコンを右ボタンでクリックすると、更新オプション(通常、ハード、空のキャッシュ)が表示されます。信じられないことに、これらのいずれもこれらのヘッダーに影響を与えません。

于 2015-12-15T16:41:09.427 に答える
13

Chromeデベロッパーツールが開いている場合(F12)、Chromeは通常キャッシュを無効にします。

これは、開発ツールの設定(dev-toolsトップバーの右側にあるギアアイコン)で制御できます。

于 2014-07-15T16:10:54.837 に答える
11

この質問は古いものですが、https経由で自己署名証明書を使用して開発していて、証明書に問題がある場合、使用するキャッシュヘッダーに関係なく、Googleは応答をキャッシュしません。

これは、このバグレポートに記載されています: https ://bugs.chromium.org/p/chromium/issues/detail?id = 110649

于 2019-03-11T12:18:24.710 に答える
0

これはkievicの答えへの追加です

ブラウザCache-Controlがリクエストでヘッダーを送信しないようにするには、Chromeコンソールを開いて次のように入力します。

location = "https://your.page.com"

ブラウザにこのヘッダーを追加させるには、[再読み込み]ボタンをクリックします。

于 2020-01-31T12:10:00.910 に答える
0

かなり古い質問ですが、最近(2020年)、シークレットウィンドウを使用してブラウジングするときにChromeが画像リソースのCache-Controlヘッダーを無視することがあることに気付きました。

私の場合、Cache-Controlディレクティブは小さい画像(〜60-200KB)には適用されましたが、大きい画像(10MB)には適用されなかったためです。

シークレットウィンドウを使用しないと、Chromeは大きな画像に対してもディスクキャッシュバージョンを使用することになります。

于 2020-07-09T08:54:58.010 に答える
-2

別のヒント:

「日付」ヘッダーを確認することを忘れないでください-サーバーの日付/時刻が正しくない場合(または別のタイムゾーンにある場合)-Chromeはリソースを何度も要求し続けます。

于 2016-04-06T09:42:52.580 に答える