Этот вопрос основан на Эта статья
заголовок ответа
HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195
заголовок запроса
GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified
В этом случае браузер отправляет как If-None-Match, так и If-Modified-Since. У меня вопрос на стороне сервера, нужно ли мне сопоставлять ОБА etag и If-Modified-Since, прежде чем я отправлю 304.
Или
Должен ли я просто посмотреть на etag и отправить 304, если etag совпадает. В этом случае я игнорирую If-Modified-Since.
Отрывок из RFC 2616 «Протокол передачи гипертекста - HTTP / 1.1»
13.3.4 Правила использования тегов объектов и дат последнего изменения
...
Исходный сервер HTTP / 1.1 после получения условного запроса, который включает в себя дату Last-Modified (например, в поле заголовка If-Modified-Since или If-Unmodified-Since) и один или несколько тегов объекта (например, в Поле заголовка If-Match, If-None-Match или If-Range) в качестве валидаторов кеша НЕ ДОЛЖНО возвращать статус ответа 304 (Not Modified), если это не согласуется со всеми полями условного заголовка в запросе.
Вам нужно только отправить и наоборот проверить ту пару, которая вас интересует. Итак, если у вас есть ETag, отправьте заголовок ETag и проверьте заголовок If-None-Match. Если у вас есть дата последнего изменения, отправьте дату последнего изменения и проверьте заголовок If-Modified-Since.
Если вы можете получить Last-Modified перед созданием контента, и вы генерируете свой etag из контента, вы должны проверить Last-Modified перед созданием контента и прервать создание, если оно соответствует, чтобы сохранить серьезный ресурс, особенно с графическими операциями, у меня есть PHP-скрипт, который занимает около 0,8 с, извлекает изображение, здесь я использую кеш-сервер, чтобы сгенерировать изображение, занимающее около 1,6 с, если оно устарело, в противном случае я возвращаю его, однако в дате if-modified-Since больше чем или равной дате изменения, я даже не извлекаю его из моего кеш-сервера, и, наконец, я использую контрольную сумму md5 содержимого в качестве etag, я генерируемый etag соответствует заголовку запроса If-None-Match, я не t утруждать себя отправкой данных, чтобы сэкономить полосу пропускания.
Сервер может использовать любой из них. Предположительно, поскольку вы предоставили оба, вы теоретически можете проверить оба на сервере, и, конечно же, браузер может предоставить и то, и другое.
Вы также можете проверить то, что быстрее. Например, если это файлы на диске, проверка времени последней модификации (mtime) будет быстрее, чем проверка содержимого с помощью MD5.
Но в других системах MD5 можно где-то хранить как метаданные, например в базе данных или заголовке, как в S3, и в этом случае ETag может быть таким же быстрым.
Конечно ты тоже не обязательный делать что-либо. То есть вы можете игнорировать любой из них и просто вернуть обычный код 200 с содержимым. Так что, если вам это неудобно, не беспокойтесь.