Php faq from поточні - поповнення

Як я попереджа кешування сторінки браузерами?

Перш ніж ми розглянемо методи клієнтського і серверного кешування, в першу чергу ми повинні зрозуміти, як взагалі запобігти кешування сторінок web-браузером (і проксі-серверами). Основний спосіб досягнення цього використовує мета-теги HTML:


Вставивши минулу дату в мета-тег Expires, ви повідомляєте браузеру, що кешована копія сторінки завжди є застарілою. Це означає, що браузер ніколи не повинен кешувати сторінку. Мета-тег Pragma: no-cache досить добре підтримуване угоду, якому слід більшість web-браузерів. Виявивши цей тег, вони зазвичай не кешують сторінку (хоча ніяких гарантій немає, це всього лише угода).

Це добре звучить, але є дві проблеми, пов'язані з використанням мета-тегів:


  1. Якщо тег не існував коли сторінка була запрошена браузером вперше, але з'являється пізніше (наприклад, ви модифікували включається файл pageheader.php. Який є шапкою кожної web-сторінки), браузер залишиться в блаженному невіданні і скористається звий кешованої копалень оригіналу.

  1. Проксі-сервери, кешуючий 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");

Схожі статті