Как установить заголовки HTTP (для контроля кэша)?

238

Как включить кэширование браузера для моего сайта? Должен ли я просто поместить контроль кэша: public где-то в моем заголовке, как это?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
Cache-Control:public;
>

Я использую последнюю версию PHP, разрабатываемую на последней версии XAMPP.

Андрей
источник
какой язык на стороне сервера вы используете? PHP ?, ASP ?, JSP? способ установки заголовков похож, но не совсем одинаков. Или, если вы кэшируете изображения ... часто это делается в вашем конфиге Apache (или веб-сервера)
scunliffe
К сожалению, это «решение» просто генерирует недопустимый DOCTYPE ;-) Если вы хотите сделать это из HTML (я бы не рекомендовал это), вы бы использовали META HTTP-EQUIV

Ответы:

198

Чтобы использовать контроль кеша в HTML, вы используете метатег , например

<meta http-equiv="Cache-control" content="public">

Значение в поле содержимого определяется как одно из четырех значений ниже.

Некоторая информация в Cache-Controlзаголовке выглядит следующим образом

HTTP 1.1. Допустимые значения = PUBLIC | ЧАСТНЫЙ | Без кэша | НЕТ-МАГАЗИНА.

Public - может кэшироваться в общедоступных общих кэшах.
Приватный - может кэшироваться только в приватном кеше.
No-Cache - может не кэшироваться.
No-Store - может быть кэширован, но не заархивирован.

Директива CACHE-CONTROL: NO-CACHE указывает, что кэшированная информация не должна использоваться, и вместо этого запросы должны перенаправляться на исходный сервер. Эта директива имеет ту же семантику, что и PRAGMA: NO-CACHE.

Клиенты ДОЛЖНЫ включать PRAGMA: NO-CACHE и CACHE-CONTROL: NO-CACHE, когда запрос без кэширования отправляется на сервер, не известный как HTTP / 1.1-совместимый. Также смотрите EXPIRES.

Примечание. Возможно, лучше указывать команды кэширования в HTTP, чем в операторах META, где они могут влиять не только на браузер, но и на прокси-серверы и других посредников, которые могут кэшировать информацию.

Codemwnci
источник
30
HTML5 запрещает это и <meta>всегда был ужасным и ненадежным способом указать кеширование.
Корнель
1
@porneL У меня проблемы с пониманием, какая часть ваших ссылок запрещает какую часть ответа ... спецификации метатегов ничего не говорят о неприязни к написанному здесь или запрете?
Феликс Ганьон-Гренье
1
@ FélixGagnon-Grenier «Атрибут http-эквивалент является перечисляемым атрибутом» означает, что он допускает только значения в таблице в спецификации. Он даже вызывает кеширование в последующем разделе («другие директивы прагмы»):> Директивы Pragma, соответствующие заголовкам, которые влияют на модель обработки HTTP (например, кеширование), не должны регистрироваться, так как это приведет к тому, что поведение уровня HTTP будет отличаться для пользовательские агенты, которые реализуют HTML, чем для пользовательских агентов, которые не делают.
Корнель
3
Указанный документ неверен по отношению к no-storeзначению (несмотря на то, что сам документ ссылается на RFC 2068 ) - no-storeпредотвращает сохранение / кэширование документа вообще, где угодно. Принимая во внимание, что no-cacheэто позволяет хранить, но он должен проверять с сервером каждый раз. Браузеры будут склонны хранить no-cacheстраницы для включения функциональности кнопки «Назад» и т. Д.
MrWhite,
3
Google предоставляет одну из самых простых ссылок для IMO-кэширования HTTP: developers.google.com/web/fundamentals/performance/…
MrWhite
137

Вы можете установить заголовки в PHP , используя:

<?php
  //set headers to NOT cache a page
  header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
  header("Pragma: no-cache"); //HTTP 1.0
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

  //or, if you DO want a file to cache, use:
  header("Cache-Control: max-age=2592000"); //30days (60sec * 60min * 24hours * 30days)

?>

Обратите внимание, что точные используемые заголовки будут зависеть от ваших потребностей (и если вам нужно поддерживать HTTP 1.0 и / или HTTP 1.1 )

scunliffe
источник
3
Pragmaи Expires, вероятно, являются избыточными для подавляющего большинства браузеров. fastly.com/blog/headers-we-dont-want
thijsai
1
@thijsai да, HTTP / 1.0 тоже сильно устарел ... используйте только те заголовки, которые вам нужны на основе вашей пользовательской матрицы
scunliffe,
51

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

Использование:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

Где: 604800 = 7 дней

PS: это может быть использовано для сброса любого заголовка

Уильям
источник
30

На странице http://www.askapache.com/htaccess/apache-speed-cache-control.html предлагается использовать что-то вроде этого:

Добавьте заголовки Cache-Control

Это относится к вашему корневому файлу .htaccess, но если у вас есть доступ к httpd.conf, это лучше.

Этот код использует директиву FilesMatch и директиву Header для добавления заголовков Cache-Control к определенным файлам.

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>
злой киви
источник
3
Важен ли порядок в этом? "max-age = 290304000, public" Или "public, max-age = 290304000" или оба одинаково правы?
Сатья Пракаш
2
Порядок не имеет значения, если значения не конфликтуют (как cacheи no-cache). max-ageи publicне конфликтуйте, поэтому порядок не имеет значения.
Блейз
1
Обратите внимание, что поскольку он использует Headerдирективу, вы должны включить mod_headers.
Скиппи ле Гран Гуру
@Skippy le Grand Gourou, как мне включить mod_headers?
Сэм
@ SamuelStratford Я читал, что он отличается от других дистрибутивов, но в Debian вы можете использовать a2enmodили сделать символическую ссылку из /etc/apache2/mods-available/headers.loadна /etc/apache2/mods-enabled/headers.load.
Skippy le Grand Gourou
21

Это лучшее, что .htaccessя использовал на моем настоящем сайте:

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

##Tweaks##
Header set X-Frame-Options SAMEORIGIN

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

<IfModule mod_headers.c>
    Header set Connection keep-alive
    <filesmatch "\.(ico|flv|gif|swf|eot|woff|otf|ttf|svg)$">
        Header set Cache-Control "max-age=2592000, public"
    </filesmatch>
    <filesmatch "\.(jpg|jpeg|png)$">
        Header set Cache-Control "max-age=1209600, public"
    </filesmatch>
    # css and js should use private for proxy caching https://developers.google.com/speed/docs/best-practices/caching#LeverageProxyCaching
    <filesmatch "\.(css)$">
        Header set Cache-Control "max-age=31536000, private"
    </filesmatch>
    <filesmatch "\.(js)$">
        Header set Cache-Control "max-age=1209600, private"
    </filesmatch>
    <filesMatch "\.(x?html?|php)$">
        Header set Cache-Control "max-age=600, private, must-revalidate"
      </filesMatch>
</IfModule>
Эрих Гарсия
источник
3
Почти идеальный пример файла .htaccess ... Было бы хорошо, если бы были включены конкретные изображения и как записать путь к изображению И куда поместить файл .htaccess (например, в каталог dir или index dir)? .. .например. '<IfModule mod_headers.c> <Files /img/myimage.jpg> Заголовок добавляет Cache-Control "max-age = 3600, must-revalidate" </ Files> </ IfModule>' ... будет ли это работать? .. . ИЛИ ... или вставьте в img dir '<filesmatch "^ (example \ .jpg | sample \ .png) $"> Набор заголовков Cache-Control "max-age = 31536000, public" </ filesmatch>' .. . все-таки стратегия кажется рискованным - в любом случае конкретные примеры было бы здорово , если ПОСС
Marco-UandL
2
только к вашему сведению: сжатие gzip в файлах JS и CSS может помочь сломать ваше SSL-шифрование. Если вы полагаетесь на безопасность, не включайте gzip
Эдуард Войд
1
Это кэширует страницу учетной записи, поэтому вы не можете выйти из нее. Еще хуже то, что кто-то не может просто получить доступ к странице учетной записи и войти в систему с помощью входа последнего пользователя. Не рекомендуется использовать на сайте электронной коммерции, затем вы должны удалить, <filesMatch "\.(x?html?|php)$">чтобы избежать кэширования статических HTML-страниц. Остальные соответствия файлов в порядке.
nicoX
1
Вы дублировали <filesmatch "\.(eot|woff|otf|ttf|svg)$">.
nicoX
2
Вы устанавливаете cssи jsв приватное состояние, если у вас есть прокси-кэширование. Я не могу найти никаких рекомендаций в вашей ссылке по этому поводу. Большинство CDN рекомендует вам кэшировать эти значения.
nicoX
14

Для сервера Apache вы должны проверить mod_expires для установки Expires и заголовков Cache-Control.

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

Header set Cache-Control "max-age=290304000, public"
Петр Штибраны
источник
5

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

Допустимые значения:

Общедоступный - может кэшироваться в общедоступных общих кэшах.
Частный - может кэшироваться только в частном кеше
no-Cache - может не кэшироваться
no-Store - может кэшироваться, но не архивироваться

Пожалуйста, будьте осторожны с чувствительностью к регистру. Добавьте следующий метатег в источник вашей веб-страницы. Разница в написании в конце тега заключается в том, что вы используете "/> = xml или"> = html.

    <meta http-equiv="Cache-control" content="public">
    <meta http-equiv="Cache-control" content="private">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="Cache-control" content="no-store">

Source-> MetaTags

Картик Н.Г.
источник
исправление: нет хранилища не должно быть кэшировано, кэширование не разрешено, но его необходимо проверить на сервере перед зарезервированием - см. palizine.plynt.com/issues/2008Jul/cache-control-attributes
DangerMouse
Cache-Control no-store - no-store похож на no-cache в том, что ответ не может быть кэширован и использован повторно, однако есть одно важное отличие. no-store требует, чтобы ресурс каждый раз запрашивался и загружался с исходного сервера. Это важная особенность при работе с личной информацией.
MarcoZen
5

OWASP рекомендует следующее,

Всегда, когда это возможно, убедитесь, что заголовок HTTP для управления кешем установлен в no-cache, no-store, must-revalidate, private; и что заголовок прагмы HTTP установлен без кэширования.

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
Вон Джун Бэ
источник