как использовать заголовки control-cache? - PullRequest
8 голосов
/ 07 апреля 2010

Я скачал Google Speed ​​Tracer для Google Chrome, чтобы увидеть, как мой сайт влияет на производительность, и он говорит мне, что мне нужно включить кэширование для определенных файлов, таких как мой style.css, изображений и т. Д.

Я читал, что приведенный ниже php-код должен указывать браузерам кэшировать html-контент. Я написал быструю php-страницу с парой изображений на ней и прикрепил приведенный ниже код вверху (перед отправкой заголовков), чтобы проверить, как это работает.

Header("Cache-Control: public, max-age=3600, must-revalidate");

Когда я возвращаюсь к анализу скоростного трейсера, он говорит ...

Резюме Из кэша: false

Заголовки запроса Прагма: нет кеша Cache-Control: max-age = 0

но под Заголовки ответа ... Cache-Control: общедоступный, max-age = 3600, должен подтвердить заново (именно то, что я указал)

Я немного растерялся, что происходит ...? Когда он говорит из кеша: false это значит из кэша сервера, а не из кэша клиента?

Ответы [ 4 ]

4 голосов
/ 07 апреля 2010

Ключ must-revalidate : это означает, что клиент спрашивает сервер, изменился ли файл. Если вы не разберетесь с этим делом, браузер получит новую копию.

Прочитайте Замечательное руководство Ноттингема по кэшированию для получения дополнительной информации. В качестве примера реализации PHP вы можете использовать мой код .

Просмотрите $_SERVER['HTTP_IF_NONE_MATCH'] и $_SERVER['HTTP_IF_MODIFIED_SINCE'] для проверки клиентов. И помните, что оба заголовка могут содержать вредоносный код. ;)

0 голосов
/ 10 февраля 2011

Вам нужно понять, что на самом деле означают эти Cache-Control поле заголовка директивы:

  • public:

    Указывает, что ответ МОЖЕТ быть кэширован любым кешем, даже если он обычно не кешируется или кешируется только в не разделяемом кеше.(См. Также Авторизация, раздел 14.8 , для получения дополнительной информации.)

  • max-age=3600 указаночто ответ является новым в течение 3600 секунд:

    Когда в кэшированном ответе присутствует директива управления кэшированием максимального возраста, ответ устарел, если его текущий возраст больше указанного значения возраста (в секундах) во время нового запроса для этого ресурса.Директива max-age для ответа подразумевает, что ответ является кешируемым (т. Е. «Общедоступным»), если не присутствует и другая, более ограничительная директива кэширования.

  • must-revalidate указывает, что кэш должен повторно проверять кэшированный ответ после того, как он устарел, прежде чем использовать этот кэшированный ответ для удовлетворения запроса:

    Когда необходимо повторно подтвердитьДиректива присутствует в ответе, полученном кешем, этот кеш НЕ ДОЛЖЕН использовать запись после того, как она устарела, чтобы ответить на последующий запрос, не проверив его сначала на сервере происхождения.(То есть, кэш ДОЛЖЕН выполнять сквозную повторную проверку каждый раз, если, основываясь исключительно на значении Expires или max-age исходного сервера, кэшированный ответ устарел.) […] Серверы ДОЛЖНЫ отправить директиву must-revalidateтогда и только тогда, когда отказ в повторной проверке запроса на объекте может привести к неправильной операции, такой как молчаливая неисполненная финансовая транзакция.

Теперь это подразумеваемое значение этих директив.

Но, как всегда, реальность немного отличается: особенно must-revalidate не интерпретируется как повторная проверка кэшированного ответа только после того, как он устарел, но что его необходимо повторно проверить накаждый последующий запрос или то, что он вообще не должен кэшироваться (возможно, поэтому он отправляет Cache-Control: max-age=0 в последующем запросе).

«From Cache: false», по-видимому, указывает на то, что ответ не был полученкеш но прямо с сервера.

0 голосов
/ 08 апреля 2010

Я не знаком с этим инструментом, однако до тех пор, пока какой-либо браузер не загрузит содержимое с заголовками кэширования, он не сможет его кэшировать. Похоже, что ваш сервер отправляет обратно ожидаемые заголовки, и страница должна кэшироваться браузером - ваш браузер должен теперь иметь копию в своем кэше. Если вы попытаетесь извлечь ту же самую страницу снова , то она будет выбрана из кэша, а не с сервера источника (при условии, что срок в 1 час не истек).

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

С

0 голосов
/ 07 апреля 2010

Когда он говорит из кеша: ложь делает это означает, что из кэша сервера и не кеш клиента?

^ Это относится к клиентскому кешу.

Настройка кэширования таким образом будет охватывать ваши PHP-файлы, но вам нужно будет внедрить что-то еще на стороне сервера для кэширования ваших изображений, CSS, скриптов и т. Д. Это можно сделать с помощью .htaccess, если ваш сервер поддерживает это.

Например, это то, что я использую в своем файле .htaccess для пары сайтов.

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)(\.gz)?$">
  Header set Expires "Thu, 15 Apr 2012 20:00:00 GMT"
  Header unset ETag
  FileETag None
</FilesMatch>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...