Насколько я понимаю спецификации, ETag, который был представлен в RFC 2616 (HTTP / 1.1), является преемником (своего рода) Last-Modified-Header, который предлагается, чтобы дать архитектору программного обеспечения больше контроля над процесс повторной проверки кеша.
Если присутствуют оба заголовка Cache-Validation-Headers (If-None-Match и If-Modified-Since), согласно RFC 2616, клиент (то есть браузер) должен использовать ETag при проверке, изменился ли ресурс. Согласно разделу 14.26 RFC 2616, сервер НЕ ДОЛЖЕН отвечать 304 Not Modified, если ETag, представленный в If-None-Match-Header, изменился, и сервер должен игнорировать дополнительный If-Modified-Since-Header , если представить. Если представленный ETag совпадает, он НЕ ДОЛЖЕН выполнять запрос, если это не указано в Date в заголовке Last-Modified-Header. (Если представленный ETag совпадает, сервер должен ответить 304 Not Modified в случае GET- или HEAD-запроса ...)
Этот раздел оставляет место для некоторых предположений:
- Сильный ETag должен меняться «каждый раз», ресурс меняется. Таким образом, необходимость отвечать чем-то другим как 304 Not Modified на запрос с неизменным ETag и If-Modified-Since-Header, который не совпадает, является небольшим противоречием, потому что сильный ETag говорит, что ресурс был не модифицируется. (Хотя это не так фатально, потому что сервер может снова отправить тот же неизмененный ресурс.)
- ...
... Ok. Пока я писал это, вопрос сводился к следующему ответу:
(Небольшое) противоречие, указанное выше, возникло из-за Weak ETags. Ресурс, помеченный как Weak ETag, мог измениться, а ETag - нет. Итак, в случае слабого ETag было бы неправильно отвечать 304 Not Modified, если ETag не изменился, но дата, представленная в If-Modified-Since не совпадает, верно?