Кэширование вывода динамически сгенерированного CSS

В моем приложении у пользователя есть возможность изменить CSS своего сайта.

Это вряд ли будет меняться так часто, но когда это произойдет, нам нужно убедиться, что они и посетители их сайта сразу видят результаты.

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

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


person Ben Foster    schedule 13.06.2012    source источник


Ответы (2)


Если вы включите хэш в свой URL-адрес, т.е.

http://server.example.com/styles/css.css?hash 

он будет перезагружен при изменении хэша, потому что браузер будет получать его из нового URL-адреса:

Версия 1:

<style type="text/css" link="styles/css.css?hash=v1" />

Версия 2:

<style type="text/css" link="styles/css.css?hash=v2" />

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

Если вы поместите заголовки управления кешем (последнее изменение, истекает, ETAG), вы не можете быть уверены, что ваш CSS будет обновляться при его изменении:

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

С хешем URL-адреса в худшем случае клиент не помещает ваш css в кеш, но пользовательский опыт не изменяется, так как они всегда получают последнюю версию.

С датой истечения срока действия или датой последнего изменения в худшем случае клиент получит старую версию, и это изменит взаимодействие с пользователем :)

person mathieu    schedule 13.06.2012
comment
Пожалуйста, перечитайте мой вопрос. Я знаю, что могу добавить что-то к URL-адресу, но я хочу знать, как это сделать, установив заголовки кеша. - person Ben Foster; 13.06.2012
comment
Это не то же самое. заголовки кеша являются частью ответа. URL инициирует запрос. - person mathieu; 13.06.2012
comment
спасибо за ваш обновленный ответ. Клиент не учитывает дату последнего изменения кеша? - person Ben Foster; 13.06.2012

Благодаря ответу Матье я использую комбинацию кэширования вывода и номеров версий для обработки аннулирования кеша.

Выходной профиль кэша:

Я создал следующий метод расширения для добавления метки времени:

    public static string AppendTimeStamp(this string src, DateTime lastModified)
    {
        if (string.IsNullOrEmpty(src))
            return src;

        return string.Format("{0}?v={1}", src, lastModified.ToString("yyyyMMddHHmmss"));
    }

Использование:

<link rel="stylesheet" href="@Url.Content("~/assets/usercss").AppendTimeStamp(CustomizationSettings.LastModified)"/>

В тех случаях, когда вы не хотите кэшировать файл, вы можете просто передать DateTime.UtcNow в качестве даты последнего изменения.

person Ben Foster    schedule 13.06.2012