web-dev-qa-db-ja.com

Chromeブラウザはif-modified-sinceヘッダーをサーバーに送信していません

サーバーからクライアントに送信されるこれらのヘッダーがあります。

Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 27 Nov 2011 11:10:38 GMT
ETag:"12341234"
Set-Cookie:connect.sid=e1u...7o; path=/; expires=Sun, 27 Nov 2011 11:40:38 GMT; httpOnly
Transfer-Encoding:chunked
last-modified:Sat, 26 Nov 2011 21:42:45 GMT

クライアントがサーバー上でファイルが変更されていないことを検証し、それ以外に「304」がある場合は「200」を送信します。

Firefoxからの送信:

if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT
if-none-match: "12341234"

chromeがページの更新時に同じものを送信しないのはなぜですか?私は.Netが実行している動作の後にいます:

context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate)
41
Asken

私の経験では、 "Private" Cache-Controlヘッダー以上のものを必要としています。 Chromeを強制してサーバーでコンテンツを再検証するには、 "Max-Age"または "Expires"のいずれかが必要です。

再検証はこれらの時間値が経過した後にのみ開始されるので、小さい値に設定する必要がある場合があることに注意してください。

12
Andy McCluggage

これを昨日半日過ごした後、問題の原因を突き止めました。 Chromeオブジェクトインスペクタ/クライアントデバッガ/ネットワークモニタ/ F12を押すとポップアップするものがある限り、Chromeはキャッシュリクエストヘッダーを送信しません。期間。(更新:Chromeの新しいバージョンでは、「キャッシュを無効にする」チェックボックスがあります。「ネットワーク」タブを開いていない場合でも(たとえば、JavaScriptコンソールを開いている場合)、このチェックボックスはすべてを無効にしますキャッシュ。

残念なことに、これをクライアント側からデバッグすると、ネットワークパネルを開いたままにして、送受信されているヘッダーと返されているコードを確認する必要があります。ネットワークパネルを開いていない場合、コンテンツがクライアント側からキャッシュされているかどうかを知る方法はありません。

サーバーアクセスログを詳しく調べると、Chromeクライアントのデバッグウィンドウを閉じるとすぐにサーバーが304s(キャッシュされたコンテンツ)を返していることがわかります。これがお役に立てば幸いです。

クロム24.0.1312.57

58
Mark

HTTPSを使用すると、この動作に対する1つの答えが見つかりました。見つけたものを共有したいと思いました。 HTTPとHTTPSのどちらを使用してリクエストするかは指定しません。

「ルールは実際には非常に単純です。証明書にエラーがあると、ページはキャッシュされません。」

https://code.google.com/p/chromium/issues/detail?id=110649

自己署名証明書を使用している場合、Chromeに例外を追加してページをロードするように指示しても、そのページのリソースはキャッシュされず、以降のリクエストは行われません。 If-Modified-Sinceヘッダーがあります。

34
Neek

さらに( https://stackoverflow.com/a/14899869/36278 ):

F12>設定>一般>キャッシュを無効にする(DevToolsが開いている間)->これをオフにします...

4
K-Gun

キャッシュに関しては、ブラウザには多くの直観に反する動作があります。応答にlast-modified-dateが含まれている場合、ブラウザは再利用する前にこれを再検証すると予想されます。しかし、主要なブラウザのどれも実際にはそれをしません。

状況に最適な設定は、ブラウザーをいつ再検証するかによって異なります。以下のリンクを参照してください。

ブラウザは直感的に反作用するだけでなく、同じ状況でもブラウザが異なると動作も異なります。たとえば、ユーザーが更新ボタンをクリックしたとき。

さまざまなブラウザー(Internet Explorer、Edge、Safari、FireFox、Chrome)がさまざまなキャッシュディレクティブ(Etag、最終変更、必須の再検証、有効期限、max-age、no-cache、no-store)でどのように動作するかを読むことができます。 https://gertjans.home.xs4all.nl/javascript/cache-control.html

0
Gert-Jan

私はこの質問が古いことを知っていますが、それでも。chromeは最後に行った更新を記憶しています。そのため、Ctrl + Shift + R(キャッシュの更新と削除)を押して、 ctrl + r(更新のみ)、chromeはキャッシュの削除を続行し、受信した応答に304を表示しません。これには回避策があります。ctrl+ shift + rを押してから、アドレスバーにフォーカスし、Enterキーを押します。etagsが正しく設定されていて、サーバーが304を提供する準備ができている場合は、デバッガー304に新しい応答コードが表示され、機能します。

0
M K