


- Expires в прошлом добавлял в ответ заголовки Expires, который содержит дату на 30 дней ранее текущей, и Cache-Control с max-age=0.
- Без Expires вообще не выставлял никаких заголовков Expires или Cache-Control.
- Expires в будущем добавлял заголовки Expires, который содержит дату на 30 больше текущей, и Cache-Control с max-age=2592000.
- Ниже приведены соображения на тему того, что происходит при нажатии F5:
- Все браузеры перезапрашивают и картинку, и внешний скрипт. (Это имеет смысл.)
- Все браузеры перезапрашивают XHR-ресурс, если срок действия кэша находится в прошлом. (Это тоже имеет смысл: браузер знает, что закэшированный XHR-ресурс устарел.)
- Единственное различие в поведение происходит в тот момент, когда для XHR-ресурса нет заголовка Expires, или же Expires выставлен в будущее. IE 7&8 не перезапрашивают XHR-ресурс, если нет Expires или Expires выставлен в будущее, даже при нажатии Ctrl-F5. Opera 10 не перезапрашивает XHR-ресурс, если нет Expires. (Эквивалента для Ctrl-F5 в Opera найти не удалось.)
- И Opera 10, и Safari 4 перезапрашивают favicon.ico во всех случаях. (Это выглядит весьма растратно.)
- Safari 4 не посылает заголовок If-Modified-Since во всех случаях. В результате ответ всегда приходит со статус-кодом 200 и включает запрашиваемый ресурс полностью. Это верно как для XHR-ресурса, так и для картинок и внешних скриптов. (Это выглядит неоптимально и отличается от поведения других браузеров.)
Кэширование XHR-запросов. Автоматизация кэширования. Уменьшение количества запросов
Условное кэширование
Сброс кэша
Кэширование на серверном уровне
Кэширование XHR-запросов Данный раздел написан после прочтения заметки от Steve Souders --F5 and XHR deep dive--, посвященной вопросам кэширования XHR-ресурсов.
Оказывается, что любые данные, полученные при помощи Ajax, никогда не будут обновлены в IE прежде истечения срока действия кэша, даже если вы форсируете обновление (Ctrl+F5). Единственный путь обновить эти данные — это вручную удалить их из кэша.
Если вы нажимаете Перезагрузку (F5), IE перезапросит все ресурсы (даже с неистекшим сроком действия кэша), за исключением XHR. Это может вызвать большое недоумение среди разработчиков при тестировании, но меня заинтересовало, какие еще проблемы существуют в этом направлении. Будет ли поведение аналогичным во всех остальных основных браузерах? Что произойдет, если срок давности кэша будет в прошлом, или заголовок Expires вообще не будет выставлен? Будет ли какой-либо эффект от добавления Cache-Control max-age (который переписывает заголовок Expires)?
Проводим тестирование
Для ответа на все заявленные вопросы была создана тестовая страница. На ней располагалась картинка, внешний скрипт и XMLHttpRequest. Ниже приведены протестированные модификации этой страницы.

Nikolay MatsievskyТаблица 4.1. Если кэшируется XHR, что происходит при нажатии F5?
Ниже резюмированы рекомендации для веб-разработчиков при работе с XHR-ресурсами:
1. Разработчики должны выставлять срок действия кэша для XHR-ресурсов или в прошлом, или в будущем, чтобы предотвратить расхождения в поведении браузеров, когда Expires вообще не выставлен.
2. Если XHR-ресурсы вообще не должны быть закэшированы, разработчикам стоит выставлять дату изменения ресурса в прошлое. Это давняя проблема с различным поведением браузеров при наличии закэшированных копий определенных ресурсов, и касается она не только XHR-запросов. Например, не всегда пользователи будут перезагружать страницу, они могут на нее попасть, просто переходя по ссылкам. В этом случае браузер выдаст им закэшированные версии XHR. Для форсирования сброса кэша мы можем выставлять, например, дополнительный GET-параметр. И это будет работать для всех браузеров и всех прокси-серверов. Более подробно вопросы сброса кэша описаны ранее в этом разделе.
3. Если XHR-запросы желательно кэшировать, то разработчики должны назначить срок истечения кэша в будущем. При тестировании в IE 7&8 разработчикам придется не забывать очищать кэш, чтобы проверить действие Перезагрузки (F5).