web-dev-qa-db-ja.com

Chromeはif-none-matchを送信していません

REST API、Firefoxに問題はありませんが、Chromeブラウザーを動作させることができません、 200 OK(または同様の)ヘッダーがサーバーに送信されないため、常にif-none-matchをスローします。

Chrome request

Firefoxを使用すると、304を完全に取得できます。

Firefox request

何かが恋しいと思います。Cache-Control: max-age=10でテストしてみましたが、何もしませんでした。

20
avances123

ChromeがIf-None-Matchを送信しない場合がある理由の1つは、応答に「HTTP /1.1」ステータス行ではなく「HTTP/1.0」が含まれている場合です。Djangoの開発サーバーなどの一部のサーバー、古いヘッダーを送信します(おそらく、キープアライブをサポートしていないため)。そうすると、ETagはChromeで機能しなくなります。

Sample HTTP/1.0 server response source

[応答ヘッダー]セクションで、解析されたバージョンの代わりに[ソースの表示]をクリックします。最初の行はおそらくHTTP/1.1 200 OKのようなものになります— HTTP/1.0 200 OK ChromeはETagヘッダーを無視しているようで、それを使用しないようですこのリソースの次のロード。

他の理由もあるかもしれません(たとえば、ETagヘッダー値が引用符で囲まれていることを確認してください)が、私の場合は他のすべての変数を削除しました。これが重要な理由です。

[〜#〜] update [〜#〜]:スクリーンショットを見ると、まさにその通りのようです(PythonのHTTP/1.0サーバー)あなたにも!

Djangoを使用していると仮定して、ローカル設定ファイルに次のハックを入れます。そうしないと、実際のHTTP /1.1プロキシを./manage.py runserverデーモンの間に追加する必要があります。この回避策 モンキーパッチ より有用なステータス行を送信するためにDjangoによって内部的に使用されるキーWSGIクラス:

# HACK: without HTTP/1.1, Chrome ignores certain cache headers during development!
#       see https://stackoverflow.com/a/28033770/179583 for a bit more discussion.
from wsgiref import simple_server
simple_server.ServerHandler.http_version = "1.1"
16
natevw

また、Webサイトの開発時によく行われるように、ブラウザでキャッシュが無効になっていないことを確認して、常に最新のコンテンツが表示されるようにします。

13
Jack Desert

Chromeでも同様の問題があり、開発にhttp://localhost:9000を使用していました(If-None-Matchは使用しませんでした)。

http://127.0.0.1:9000Chromeに切り替える1 リクエストでIf-None-Matchヘッダーの送信を自動的に再開しました。

さらに、Devtools > Network > Disable Cache [ ]がオフになっていることを確認します。

1 これが文書化されている場所はどこにも見つかりません-Chromeがこのロジックの原因であると思います。

1
Nick Grealy

Chromeは私にも「If-None-Match」ヘッダーを送信していませんでした。キャッシュ制御ヘッダーがありませんでした。ブラウザを閉じて再度開くと、期待どおりに「If-None-Match」ヘッダーの送信が開始されました。したがって、ブラウザを再起動することは、この種の問題があるかどうかを確認するためのもう1つのオプションです。

0
hgasimov