Chrome не отправляет if-none-match

Я пытаюсь выполнить запросы к моему REST API, у меня нет проблем с Firefox, но в Chrome я не могу заставить браузер работать, всегда бросает 200 OK, потому что no if-none-match (или аналогичный) заголовок отправляется на сервер.

Chrome request

С Firefox я получаю 304 отлично.

Firefox request

Я думаю, что я что-то пропустил, я пробовал с Cache-Control: max-age=10 тестировать, но ничего.

Ответ 1

Одна из причин, по которой Chrome не может отправить If-None-Match, - это когда ответ включает в себя "HTTP/1.0" вместо строки состояния "HTTP/1.1". Некоторые серверы, такие как сервер разработки Django, отправляют более старый заголовок (возможно, потому, что они не поддерживают keep-alive), и когда они это делают, ETags не работают в Chrome.

Sample HTTP/1.0 server response source

В разделе "Заголовки ответов" нажмите "просмотреть исходный код" вместо анализируемой версии. Первая строка, вероятно, прочитает что-то вроде 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"

Ответ 2

Также проверьте, что кеширование не отключено в браузере, как это часто делается при разработке веб-сайта, чтобы вы всегда видели последний контент.

Ответ 3

Chrome не отправлял мне заголовок "If-None-Match". У меня не было заголовков управления кешем. Я закрыл браузер, снова открыл его, и он начал отправлять заголовок "If-None-Match", как ожидалось. Таким образом, перезапуск браузера - еще один вариант, чтобы проверить, есть ли у вас такая проблема.