После задавания вопроса об отправке “304 Не Измененный” для изображений, сохраненных в в хранилище данных Google App Engine, у меня теперь есть вопрос о Cache-Control
.
Мое приложение теперь отправляет Last-Modified
и Etag
, но по умолчанию GAE alsto отправляет Cache-Control: no-cache
. Согласно этой странице:
Директива “без кэшей”, согласно RFC, говорит браузеру, что это должно подтвердить с сервером прежде, чем служить странице от кэша. [...] На практике, IE и Firefox начали рассматривать директиву без кэшей, как будто это сообщает, что браузер не к даже кэширует страницу.
Поскольку я ДЕЙСТВИТЕЛЬНО хочу, чтобы браузеры кэшировали изображение, я добавил следующую строку к своему коду:
self.response.headers['Cache-Control'] = "public"
Согласно той же странице как прежде:
“Управление кэша: общедоступная” директива [...] говорит браузеру и прокси [...], что страница может кэшироваться. Это хорошо для нечувствительных страниц, поскольку кэширование улучшает производительность.
Вопрос состоит в том, если это могло бы быть вредно для приложения в некотором роде? Было бы лучше отправить Cache-Control: must-revalidate
чтобы "вынудить" браузер подтвердить (я предполагаю, это - поведение, которое было первоначально причиной позади отправки Cache-Control: no-cache
)
Эта директива настаивает, чтобы браузер подтвердил страницу против сервера прежде, чем служить ей от кэша. Обратите внимание, что это неявно позволяет кэшу браузера страница.
Нет необходимости устанавливать Cache-Control: public
, если ваш контент не защищен аутентификацией HTTP или SSL.
Попробуйте установить Cache-Control: max-age = nn
(где nn - целое число секунд, в течение которых вы хотите, чтобы кеши считали ответ свежим). AppEngine должен удалить отсутствие кеширования.
Это не может быть вредным для вашего приложения, единственный риск, описанный на этой странице, заключается в том, что публичные прокси (например, используемые интернет-провайдерами) кэшируют ваше изображение. Если изображение является конфиденциальным или специфическим для пользователя, вы не захотите, чтобы это произошло. Во всех остальных случаях кэширование - это именно то, что вам нужно.
Смотрите http://www.kyle-jensen.com/proxy-caching-on-google-appengine, там дается хорошее объяснение установки заголовков cache-control для GAE.