Очень запутался насчет заголовка «Expires» здесь!
Иногда это работает, как ожидалось, а иногда нет.
Я использую следующий код для установки моих заголовков срока действия. Обратите внимание, что это делается с ASP.NET в пользовательском атрибуте MVC - это не очень важно здесь - но объясняет, откуда приходит 'filterContext'
.
HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);
// my own custom header so we know what time it was
filterContext.HttpContext.Response.AddHeader("CurrentTime", DateTime.Now.ToString());
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(DateTime.Now.Add(cacheDuration));
cache.SetMaxAge(cacheDuration);
cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
Это иногда дает мне такие заголовки:
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=413
Date: Wed, 18 Feb 2009 05:24:19 GMT
Expires: Wed, 18 Feb 2009 05:21:12 GMT
CurrentTime: 2/17/2009 9:21:12 PM
Иногда так:
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=600
Date: Wed, 18 Feb 2009 05:27:55 GMT
Expires: Wed, 18 Feb 2009 05:27:55 GMT
CurrentTime: 2/17/2009 9:27:55 PM
Я запускаю все через Fiddler и смотрю, чтобы узнать, когда что-то запрашивается и когда оно поступает из кеша браузера.
Теперь странно то, что в IE кэширование всегда работает как положено. Ссылка на мой метод действия ASP.NET MVC появляется в Fiddler, а затем, когда я снова нажимаю на эту же ссылку, она поступает из кэша.
Однако в Chrome это иногда происходит, а иногда и не приходит из кэша! Под кешем я не имею в виду дополнительный HTTP-запрос.
Например, такая ссылка:
http://ipv4.fiddler:62669/gallery/mainimage/2
придет из кеша в IE, но вернется с 200 в хроме. Тогда иногда в Chrome это происходит из кеша. Я попытался очистить кеш браузера и повторить попытку - каждый раз один и тот же результат.
Chrome пытается сделать что-то «умное» и просто с треском проваливается - или мне нужен дополнительный заголовок?
Мне интересно, связано ли это с тем, что моя дата заголовка Expires
никогда не будет в будущем. если я посмотрю на заголовки Google для их размещенного файла jQuery , я увижу, что заголовки выглядят следующим образом (срок действия истекает здесь в 2010 году - через год).
Cache-Control: public, max-age=31536000
Date: Wed, 18 Feb 2009 05:44:53 GMT
Expires: Thu, 18 Feb 2010 05:44:53 GMT
Не должно ли истекать быть на самом деле в будущем ??
Согласно спецификации HTTP :
Если ответ включает в себя оба Истекает
заголовок и директива максимального возраста,
директива максимального возраста отменяет
Истекает заголовок, даже если истекает
заголовок более ограничительный. Это правило
позволяет серверу происхождения предоставить,
для данного ответа, дольше
время истечения до HTTP / 1.1 (или
позже) кеш, чем в HTTP / 1.0
кэш. Это может быть полезно, если определенно
HTTP / 1.0 кэши неправильно вычисляются
возраст или срок годности, возможно, из-за
к рассинхронизированным часам.
Поэтому кажется, что Chrome должен соблюдать директиву max-age, даже если «Expires» совпадает с текущим временем, но, похоже, он этого не делает.