Ответ 1
Одна из причин, по которой Chrome не может отправить If-None-Match
, - это когда ответ включает в себя "HTTP/1.0" вместо строки состояния "HTTP/1.1". Некоторые серверы, такие как сервер разработки Django, отправляют более старый заголовок (возможно, потому, что они не поддерживают keep-alive), и когда они это делают, ETags не работают в Chrome.
В разделе "Заголовки ответов" нажмите "просмотреть исходный код" вместо анализируемой версии. Первая строка, вероятно, прочитает что-то вроде HTTP/1.1 200 OK
- если он говорит HTTP/1.0 200 OK
, Chrome, похоже, игнорирует заголовок ETag
и не будет использовать его при следующей загрузке этого ресурса.
Также могут быть и другие причины (например, убедитесь, что значение заголовка ETag отправлено внутри кавычек), но в моем случае я удалил все остальные переменные, и это важно.
UPDATE: глядя на ваши скриншоты, похоже, что это точно так же (сервер HTTP/1.0 от Python) для вас!
Предполагая, что вы используете Django, поместите следующий хак в свой файл локальных настроек, иначе вам придется добавить фактический прокси HTTP/1.1 между вами и демоном ./manage.py runserver
. Этот обходной путь обезьяны патчей - ключевой класс WSGI, используемый внутри Django, чтобы отправить более полезную строку состояния:
# 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"