Браузерное кэширование файлов CSS

Быстрый вопрос относительно CSS и браузера. Я попытался найти SO и нашел несколько похожих сообщений, но ничего определенного.

Я использую один или два файла CSS в своих веб-проектах. На них есть ссылки в HEAD моих веб-страниц. Когда я попадаю на одну из своих страниц, кэшируется ли CSS, чтобы он не загружался повторно при каждом запросе? Я надеюсь, что это так. IE, Firefox и Safari обрабатывают это по-разному? Если браузер закрыт, обновляется ли CSS при первом посещении, когда открывается новый экземпляр браузера?


person jwalkerjr    schedule 20.01.2009    source источник
comment
Часть заголовка, посвященная размеру файла, немного вводит в заблуждение, поскольку фактический вопрос вообще не связан с размерами файлов. CSS-файлы и кэширование браузера или кэширование браузером файлов CSS выглядят намного лучше... ‹/twocents›   -  person Már Örlygsson    schedule 20.01.2009


Ответы (6)


Ваш файл вероятно будет кэширован, но это зависит...

Различные браузеры ведут себя немного по-разному, особенно при работе с неоднозначными/ограниченными заголовками кэширования, исходящими от сервера. Если вы отправляете четкий сигнал, браузеры подчиняются практически все время.

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

Некоторые (например, Apache), вероятно, будут обслуживать известные статические типы файлов с заголовками HTTP, поощряющими браузер кешировать их, в то время как другие серверы могут отправлять no-cache команды с каждым ответом — независимо от типа файла.

...

Итак, во-первых, прочитайте некоторые из превосходных учебников по кэшированию HTTP. HTTP-кэширование и блокировка кеша для издателей контента стало настоящим откровением для меня :-)

Затем установите и возитесь с Firebug и Live HTTP Headers, чтобы узнать, какие заголовки на самом деле отправляет ваш сервер.

Затем прочитайте документацию вашего веб-сервера, чтобы узнать, как настроить его до совершенства (или попросите вашего системного администратора сделать это за вас).

...

Что происходит при перезапуске браузера, зависит от браузера и конфигурации пользователя.

Как правило, браузер с большей вероятностью будет связываться с сервером после каждого перезапуска, чтобы узнать, не изменилось ли что-нибудь (см. If-Last-Modified и If-None-Match).

Если вы правильно настроите свой сервер, он сможет возвращать суперкороткий 304 Not Modified (требует очень небольшой пропускной способности), и после этого браузер будет использовать кеш как обычно.

person Már Örlygsson    schedule 20.01.2009
comment
Ctrl-K уже показывает нам живые заголовки http? Зачем нам нужно использовать надстройку Live HTTP Header? - person Pacerier; 18.07.2012

К первой части вашего вопроса - да, браузеры кэшируют файлы css (если это не отключено конфигурацией браузера). Во многих браузерах есть комбинация клавиш для перезагрузки страницы без кеша. Если вы внесли изменения в css и хотите, чтобы пользователи увидели их немедленно, а не ждали в следующий раз, когда браузер перезагрузит файлы без кэширования, вы можете изменить способ обслуживания CSS, добавив некоторые параметры в URL-адрес, например:

/style.css?modified=20012009
person Deniss Kozlovs    schedule 20.01.2009
comment
Гений! /Style.css?deployment={Идентификатор_развертывания} - person Paulius Zaliaduonis; 01.03.2012
comment
Поддерживается ли такое поведение RFC? - person Pacerier; 18.07.2012
comment
@Pacerier Да, это поддерживаемый способ работы. Поскольку браузер просто видит /style.css?modified=20012009 как URL-адрес, это эквивалентно изменению имени вашего файла CSS каждый раз, когда вы делаете выпуск. Поскольку браузер считает файл новым, он не будет пытаться использовать его кэшированную версию. - person plowman; 20.07.2012
comment
@plowman, я имею в виду, что да, это работает в диких условиях, но действительно ли такое поведение поддерживается официальными предписывающими стандартами rfc? - person Pacerier; 20.07.2012
comment
@Pacerier - для меня это выглядит как довольно стандартный параметр HTTP GET. Что заставляет вас думать, что это не будет поддерживаться? Здесь ничего особенного не происходит... - person Jesse Webb; 18.12.2012

Это зависит от заголовков HTTP, отправленных с файлами CSS, как указано в обоих предыдущих ответах, если вы не добавляете какие-либо данные для очистки кеша в href. например

<link href="/stylesheets/mycss.css?some_var_to_bust_cache=24312345" rel="stylesheet" type="text/css" />

Некоторые фреймворки (например, rails) вставляют их по умолчанию.

Однако, если вы получаете что-то вроде firebug или fiddler, вы можете точно видеть, что ваш браузер загружает по каждому запросу, что особенно полезно для выяснения того, что ваш браузер делает, а не только то, что это должно делать.

Все браузеры должны одинаково учитывать заголовки кеша, если только они не настроены на их игнорирование (но должны быть исключения)

person DanSingerman    schedule 20.01.2009

Вероятно, стоит отметить, что IE не кэширует файлы css, вызываемые другими файлами css с помощью метода @import. Так, например, если ваша html-страница ссылается на «master.css», который извлекает «reset.css» через @import, то reset.css не будет кэшироваться IE.

person Andy Ford    schedule 20.01.2009
comment
Это кажется чрезвычайно важным моментом. Можете ли вы добавить ссылку? - person Liam; 12.07.2010
comment
Это не похоже на правду, ср.: ссылка см. этот комментарий/ответ: Мюррей | 27 мая 2009 г., 9:52 Стив, я также слышал, что при использовании @ import браузеры могут не кэшировать файлы css, в отличие от файла . Но мне не удалось это проверить. Знаете ли вы, действительно ли это имеет значение с точки зрения кэширования? Если это так, это может быть еще одной причиной избегать @ import. Стив Содерс | 27 мая 2009 г., 14:26 Мюррей: Я этого не слышал, и в моих тестах этого не происходит. - person Henrik Stenbæk; 29.11.2011

Это зависит от того, какие заголовки вы отправляете вместе с файлами CSS. Проверьте конфигурацию вашего сервера, так как вы, вероятно, не отправляете их вручную. Выполните поиск в Google по запросу «http-кеширование», чтобы узнать о различных параметрах кэширования, которые вы можете установить. Например, вы можете заставить браузер загружать новую копию файла каждый раз, когда он загружает его, или вы можете кэшировать файл на одну неделю...

person Jan Hančič    schedule 20.01.2009

Если вы не испортили свой сервер, да, он кэшируется. Все браузеры должны обрабатывать его одинаково. Некоторые люди (например, я) могут настроить свои браузеры так, чтобы они не кэшировали файлы. Закрытие браузера не делает файл в кеше недействительным. Однако изменение файла на сервере должно привести к обновлению файла.

person Al W    schedule 20.01.2009
comment
Это в основном неправильно. Существуют различия между браузерами в отношении кеширования. И как только файл кэшируется на клиенте, он не будет загружен снова, пока срок действия кеша (по какой-либо причине) не истечет, изменение файла на сервере не будет иметь значения... - person Jan Hančič; 20.01.2009