Як встановити заголовки HTTP (для кеш-контролю)?


237

Як увімкнути кешування браузера для мого сайту? Чи я просто ставлю кеш-контроль: 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 | ПРИВАТНА | NO-CACHE | НЕТ-МАГАЗИН.

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

Директива CACHE-CONTROL: NO-CACHE вказує, що кешована інформація не повинна використовуватися, а натомість запити повинні бути спрямовані на початковий сервер. Ця директива має ту саму семантику, що і PRAGMA: NO-CACHE.

Клієнти ОБОВ'ЯЗКОВО включають як PRAGMA: NO-CACHE, так і CACHE-CONTROL: NO-CACHE, коли запит без кешу надсилається на сервер, який, як відомо, не відповідає HTTP / 1.1. Також дивіться ДОСЛІДЖЕННЯ.

Примітка. Можливо, краще вказати команди кешу в HTTP, ніж у операторах META, де вони можуть впливати більше на браузер, але проксі-сервери та інші посередники, які можуть кешувати інформацію.


30
HTML5 забороняє це, і <meta>це завжди був жахливим і неохайним способом вказати кешування.
Корнель

1
@porneL У мене виникають проблеми з розумінням того, яка частина ваших посилань забороняє, яка частина відповіді ... специфікації метатегів нічого не говорять про те, що не люблять написане тут або забороняють це?
Фелікс Ганьон-Греньє,

1
@ FélixGagnon-Grenier "Атрибут http-equiv - це перерахований атрибут" означає, що він допускає лише значення в таблиці в специфікації. Він навіть викликає кешування в наступному розділі ("інші директиви прагми"):> Директиви прагми, відповідні заголовкам, які впливають на модель обробки HTTP (наприклад, кешування), не повинні реєструватися, оскільки це призведе до того, що поведінка на рівні HTTP відрізнятиметься для користувацькі агенти, які реалізують HTML, ніж для користувацьких агентів, які цього не роблять.
Корнель

3
Цитований документ є невірним щодо no-storeзначення (незважаючи на сам документ, на який посилається RFC 2068 ) - no-storeне дозволяє документу зберігати / кешувати взагалі і в будь-якому місці. Тоді як no-cacheвін дозволяє зберігати його, але він повинен щоразу перевірятись із сервером. Браузери будуть , як правило , для зберігання no-cacheсторінок , щоб включити задню функціональні кнопки і т.д.
MrWhite

3
Google надає одну з найпростіших посилань на кешування HTTP IMO: 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 )


3
Pragmaі Expires, ймовірно, є зайвими для переважної більшості браузерів. fastly.com/blog/headers-we-dont-want
thijsai

1
@thijsai так, HTTP / 1.0 теж застаріло ... використовуйте лише потрібні заголовки на основі вашої матриці користувача
scunliffe

49

Як я писав , найкраще використовувати файл .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 пропонує використовувати щось подібне:

Додати заголовки кеш-керування

Це йде у вашому кореневому файлі .htaccess, але якщо у вас є доступ до httpd.conf, це краще.

Цей код використовує директиву FilesMatch та директиву заголовка для додавання заголовків кеш-керування до певних файлів.

# 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

@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 зображення чи dir index)? .. .ег. '<IfModule mod_headers.c> <Файли /img/myimage.jpg> Заголовок додає кеш-контроль "max-age = 3600, необхідно повторно підтвердити" </Files> </IfModule> "... це буде працювати? .. АБО ... або вставлено до img dir '<filesmatch "^ (example \ .jpg | sample \ .png) $"> Заголовок встановлено кеш-керування "max-age = 31536000, public" </filesmatch>' .. . все-таки стратегія здається ризикованим - в будь-якому випадку конкретні приклади було б здорово , якщо ПОСС
Marco-UandL

2
просто FYI: стиснення gzip для файлів JS та CSS може допомогти порушити ваше шифрування SSL. Якщо ви покладаєтесь на безпеку, не вмикайте gzip
Eduard Void

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 set Cache-Control "max-age=290304000, public"

5

Тег керування мета-кешами дозволяє веб-видавцям визначати, як слід керувати сторінками кешами. Вони включають в себе директиви, щоб оголосити, що повинно бути кешованим, що може зберігатися кешами, модифікаціями механізму закінчення терміну дії, а також контролями відновлення та перезавантаження.

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

Загальнодоступні - можуть бути кешовані у загальнодоступних кешах.
Приватні - можуть зберігатись лише в кешованому режимі
без кеша - не
можуть бути кешовані

Будьте уважні щодо чутливості до справ. Додайте наступний метатег у джерело веб-сторінки. Різниця в написанні в кінці тегу полягає в тому, що ви використовуєте "/> = 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">

Джерело-> Метатеги


виправлення: не зберігається кеш, не потрібно кешувати кеш, але його потрібно перевірити на сервері, перш ніж зарезервувати - див. palizine.plynt.com/isissue/2008Jul/cache-control-attributes
DangerMouse

Cache-Control no-store - no-store є схожим на no-cache тим, що відповідь не може бути кешована і повторно використана, однак є одна важлива відмінність. no-store вимагає щоразу запитувати та завантажувати ресурс із сервера-джерела. Це важлива особливість при роботі з приватною інформацією.
MarcoZen

5

OWASP рекомендує:

Коли це можливо, переконайтеся, що заголовок HTTP-керування кешем встановлений без кешу, не зберігається, повинен бути повторно підтверджений, приватний; і що HTTP-заголовок прагми встановлено без кешу.

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.