Я пытаюсь иметь базовое поведение в отношении моей стратегии кэширования: файлы должны кэшироваться и каждый раз повторяться на сервере. Поэтому я бы хотел, чтобы 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
(это из chrome devtools, с отключенным отключением кэша)
Вы можете видеть, что ответ содержит заголовок Cache-Control: No-cache и заголовок If -ified-Since соответствует Last-updated. ETag тоже совпадает.
Разве Apache не отправляет 304 в этом случае?
РЕДАКТИРОВАТЬ
Отключение ETag в apache с помощью
Header unset ETag
делает поведение кэширования более предсказуемым ...
Cache-Control:max-age=0
отключен кеш, поэтому вы видитеCache-Control:No-cache
ответ.Ответы:
Кажется, это старая ошибка , объясняющая, почему это
Header unset ETag
имеет значение.Apache 2.4.0+ автоматически добавляет имя метода сжатия в ETag (как видно из заголовков) и предотвращает ответ 304.
Новейшие версии mod_deflate поддерживают DeflateAlterETag, который можно использовать для управления этим поведением:
источник
DeflateAlterETag Remove
возможность сделать именно этоЭтот запрос выделяется в запросе как немного странный:
Вероятно, более важно, хотя, я заметил, что возвращаемое содержание - HTML. Это генерируется динамически? Apache МОЖЕТ отправить ответ 304, но если вы не используете статический контент, Apache не выполняет этот вызов, и это зависит от логики вашего приложения. Например, большинство php-приложений имеют ограниченную поддержку для таких вещей.
Кэш внешнего интерфейса может помочь, так как приложение для кэширования может проверять время модификации, etag и т. Д., Но только если и приложение, и заголовки запросов являются дружественными к кэшу. Например, приложение должно установить соответствующие заголовки, чтобы указать, что контент кешируется, а такие вещи, как заголовок Cache-control в вашем запросе, будут отрицать кеш. Ваши заголовки не выглядят дружественными к кешу.
источник
Если у вас настроен Apache
Cache-Control:No-cache
, Apache никогда не отправитHTTP 304 Not modified
клиенту.Если вы хотите пересмотреть некоторые запросы, поместите их
Cache-Control:No-cache
только на те страницы, где вам это нужно. Вам не нужно повторно проверять все ресурсы, и вы тратите пропускную способность, делая это.источник