2012-03-27 2 views
23

Каково окончательное решение для предотвращения кэширования данных http? Мы можем модифицировать клиента, а также сервер, поэтому я думаю, что мы можем разделить задачу между клиентом и сервером.Избегайте кэширования HTTP-ответов

Client может добавлять к каждому запросу случайный параметр http://URL/path?rand=6372637263 - У меня такое ощущение, что использование только таким образом он не работает на 100% - может быть есть некоторые интеллектуальные прокси, которые могут обнаружить, что ... С другой стороны, я подумайте, что если URL-адрес отличается от предыдущего, прокси-сервер не может просто решить, чтобы отправить обратно некоторый кешированный ответ.

На сервере может контролировать кучу HTTP заголовков:

Expires: Tue, 03 Jul 2001 06:00:00 GMT 
Last-Modified: {now} GMT 
Cache-Control: no-store, no-cache, must-revalidate, max-age=0 
Cache-Control: post-check=0, pre-check=0 
Pragma: no-cache 

Все комментарии к этому, что это лучший подход?

ответ

38

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

Expires: Tue, 03 Jul 2001 06:00:00 GMT 
Last-Modified: {now} GMT 
Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate 

Избегайте перезаписи URL-адресов на клиенте, поскольку он загрязняет кэши, и вызывает другие странные семантические проблемы. Кроме того:

  • Используйте один Cache-Control заголовок (см rfc 2616), поскольку поведение с несколькими записями неопределен. Также специфичные записи MSIE во втором управлении кешем - at best redundant.

  • no-store - о безопасности данных. (это означает, что не записывать это на диск - кэши по-прежнему позволяют хранить ответ в памяти).

  • Pragma: no-cache не имеет смысла в ответе сервера - это заголовок запроса, который означает,

  • Использование как Expires (http/1.0), так и cache-control (http/1.1) не является избыточным, поскольку существуют прокси, которые говорят только на http/1.0 или будут понижать протокол.

  • Технически последний измененный заголовок является избыточным в свете no-cache, но это хорошая идея оставить его там.

  • Некоторые браузеры будут игнорировать последующие директивы в заголовке управления кешем после того, как они натолкнутся на тот, который они не распознают, - поэтому сначала поставьте важный материал.

+2

Я замечаю, что люди все еще смотрят на этот ответ.Как и все в Интернете, он немного устарел - pushstate позволяет использовать сторонние клиенты с URL-адресами - но проявляйте особую осторожность! Посмотрите также на mod_pagespeed. Это позволяет много переписывать URL-адреса и слияние содержимого на сервере. Помимо этого, остальная часть контента в моем ответе все еще сохраняется. – symcbean

+0

вы можете объяснить 'Истекает: Вт, 03 июл 2001 06:00:00 GMT' - должно ли это быть« Истекает: Чт, 01 января 1970 года 00:00:00 GMT'? – lf215

+1

@ If215: в любое время в прошлом * должен * предотвратить кеширование. Однако, когда вы начинаете говорить с большим количеством компьютеров, вы найдете людей с плоскими батареями часов, неправильно настроенными часовыми поясами и другими странностями. – symcbean

4

Добавление Header

Cache-control: private 

гарантирует, что кэш gataway не кэширует такой запрос.

Я хотел бы рекомендовать вам Фабьен Potencier лекцию о кэшировании: http://www.slideshare.net/fabpot/caching-on-the-edge

+0

Прохладный презентация. Спасибо за это. – STeN

+0

Это не совсем так. По моему опыту, Akamai CDN стремится (ухаживать?) Игнорировать это и будет до сих пор кэшировать ваши личные данные для вас. – Greggg