Почему Apache отправляет 200 хорошо в то время как Измененные в последний раз соответствия If-modified-since?

Я пытаюсь иметь основное поведение относительно своей стратегии кэширования: файлы должны кэшироваться и подтверждаться с сервером каждый раз. Таким образом, я хотел бы, чтобы Apache передал 304 обратно.

Вот диалоговое окно, которое происходит для каждого обновления браузера:

Status Code:200 OK

Request Headers

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie: ...
Host:...
If-Modified-Since:Tue, 14 Oct 2014 15:10:37 GMT
If-None-Match:"1461-505636af08fcd-gzip"
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36

Response Headers

Accept-Ranges:bytes
Cache-Control:No-cache
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1412
Content-Type:text/html
Date:Tue, 14 Oct 2014 16:58:05 GMT
ETag:"1461-505636af08fcd-gzip"
Keep-Alive:timeout=5, max=99
Last-Modified:Tue, 14 Oct 2014 15:10:37 GMT
Server:Apache/2.4.6 (Ubuntu)
Vary:Accept-Encoding

(это от хрома devtools, с Отключают неконтролируемый кэш),

Вы видите, что ответ содержит Заголовок Cache-Control:No-cache, и что заголовок If-modified-since соответствует Измененному в последний раз. Завершающий тег соответствует также.

Не был должен Apache отправлять 304 в этом случае?

Править

Отключение Завершающих тегов в апаче с

 Header  unset ETag

делает кэширующееся поведение большим количеством predictible...

10
задан 14 October 2014 в 21:50
3 ответа

Этот пункт выделяется в запросе как немного странный:

Cache-Control:max-age=0

Вероятно, что более важно, я заметил, что возвращаемый контент - это HTML. Генерируется ли он динамически? Apache МОЖЕТ отправить ответ 304, но если вы не обслуживаете статический контент, это не задача Apache, чтобы сделать этот вызов, и это сводится к логике вашего приложения. Например. большинство приложений php имеют ограниченную поддержку таких вещей.

Внешний кеш может помочь, поскольку приложение для кэширования может проверять время модификации, etag и т. Д., Но только если и приложение, и заголовки запроса совместимы с кешем. Например, приложение должно установить соответствующие заголовки, чтобы указать, что контент кэшируется, и такие вещи, как заголовок Cache-control в вашем запросе, будут отрицать кеш. Ваши заголовки не подходят для кеширования.

0
ответ дан 2 December 2019 в 22:12

Если у вас настроен Apache с Cache-Control: No-cache , Apache никогда не будет отправлять HTTP 304 Не изменено клиенту.

Если вы хотите повторно подтвердить некоторые запросы, поместите Cache-Control: No-cache только на те страницы, где вам это нужно. Вам не нужно повторно проверять все ресурсы, и вы тратите впустую пропускную способность, делая это.

0
ответ дан 2 December 2019 в 22:12

Кажется, это старая ошибка , объясняющая, почему Header unset ETag имеет значение.

Apache 2.4.0+ автоматически добавляет имя метода сжатия в ETag (как видно в ваших заголовках) и предотвращает ответ 304.

Последние версии mod_deflate поддерживают DeflateAlterETag , который можно использовать для управления этим поведением:

DeflateAlterETag NoChange
7
ответ дан 2 December 2019 в 22:12

Теги

Похожие вопросы