Як я попереджа кешування сторінки браузерами?
Перш ніж ми розглянемо методи клієнтського і серверного кешування, в першу чергу ми повинні зрозуміти, як взагалі запобігти кешування сторінок web-браузером (і проксі-серверами). Основний спосіб досягнення цього використовує мета-теги HTML:
Вставивши минулу дату в мета-тег Expires, ви повідомляєте браузеру, що кешована копія сторінки завжди є застарілою. Це означає, що браузер ніколи не повинен кешувати сторінку. Мета-тег Pragma: no-cache досить добре підтримуване угоду, якому слід більшість web-браузерів. Виявивши цей тег, вони зазвичай не кешують сторінку (хоча ніяких гарантій немає, це всього лише угода).
Це добре звучить, але є дві проблеми, пов'язані з використанням мета-тегів:
- Якщо тег не існував коли сторінка була запрошена браузером вперше, але з'являється пізніше (наприклад, ви модифікували включається файл pageheader.php. Який є шапкою кожної web-сторінки), браузер залишиться в блаженному невіданні і скористається звий кешованої копалень оригіналу.
- Проксі-сервери, кешуючий web-сторінки, як наприклад загальний ISP, взагалі не буде досліджувати безпосередньо вміст HTML-документа. Замість цього вони покладаються тільки на web-сервер, з якого прийшли документи, і протокол HTTP. Іншими словами, web-браузер може вважати, що не повинен кешувати сторінку, але проксі-сервер між браузером і вашим web-сервером ймовірно не знає цього - і продовжить відправляти клієнту ту ж саму, вже застарілу, сторінку.
Кращий підхід полягає в тому, щоб використовувати безпосередньо протокол HTTP за допомогою функції PHP header. еквівалентно наведеними вище двом мета-тегах:
Ми можемо піти на один крок вперед, скориставшись заголовком Cache-Control. сумісним з браузерами, які підтримують HTTP 1.1:
Це гарантує, що ніякої web-браузер або проміжний проксі-сервер не буде кешувати сторінку, таким чином відвідувачі завжди отримають найостаннішу версію контенту. Фактично, перший заголовок повинен бути самодостатнім, це кращий спосіб гарантувати, що сторінка не кешируєтся. Заголовки Cache-Control і Pragma додані з метою «підстрахуватися». Хоча вони не працюють у всіх браузерах або проксі, вони відловлять деякі випадки, в яких Expires не працює належним чином (наприклад, якщо дата на комп'ютері клієнта встановлена неправильно).
Звичайно, повна відмова від кешування забезпечує нас проблемами, які ми обговорювали на початку цього розділу. Зараз ми розглянемо рішення цих проблем.
Internet Explorer і кешування завантаження файлів
Наше обговорення про PDF, наведене в розділі 3, Альтернативні типи контенту, пояснило, що проблеми можуть виникати, коли ви маєте справу з кешуванням і завантаженням файлів. Якщо при обслуговуванні завантаження файлу PHP-скриптом використовуються такі заголовки, як наприклад Content-Disposition: attachment, filename = myFile.pdf або Content-Disposition: inline, filename = myFile.pdf. у вас будуть проблеми з Internet Explorer'ом, якщо ви повідомите браузер не кешувати сторінку.
Internet Explorer оперує завантаженням досить незвичайним чином, виконуючи два запити до web-сайту. Перший запит завантажує файл і зберігає його в кеші, поки не буде створено другий запит (без збереження відгуку). Цей запит викликає процес передачі файлу кінцевому користувачеві відповідно до типу файлу (наприклад, запускає Acrobat Reader, якщо файл є PDF-документом). Це означає, що якщо ви відправили заголовки, що забороняють браузеру кешувати сторінку, Internet Explorer видалить файл між першим і другим запитом, в результаті чого кінцевий користувач нічого не отримає. Якщо файл, який ви віддаєте PHP-скриптом, не змінюється, одним з найпростіших рішень буде прибрати «забороняють кешування» заголовки з скрипта.
Мануал рекомендує так само додавати
// always modified
header ( "Last-Modified:". gmdate ( "D, d M Y H: i: s"). "GMT");