Какой лучший способ для версии CSS и JS URL?


26

В соответствии с популярными рекомендациями Yahoo по ускорению работы вашего сайта мы обслуживаем статический контент из CDN с использованием заголовков истечения срока действия кэша в будущем. Конечно, нам необходимо периодически обновлять эти «статические» файлы, поэтому в настоящее время мы добавляем инфиксную версию как часть имени файла (на основе суммы SHA1 содержимого файла). Таким образом:

styles.min.css

становится:

styles.min.abcd1234.css

Однако управление версионными файлами может стать утомительным, и мне было интересно, может ли запись аргумента GET быть чище и лучше:

styles.min.css?v=abcd1234

Что вы используете и почему? Есть ли какие-либо соображения, связанные с браузером или прокси / кешем, которые я должен рассмотреть?


Причина, по которой я спрашиваю, состоит в том, что я, кажется, вспоминаю, что слышал причину НЕ использовать стиль GET-аргумента, но я не могу вспомнить почему.
Дэвид Эйк

Не требует ли использование GET-аргумента обработки таблицы стилей с помощью какого-либо серверного сценария (и он больше не будет статичным)?
Lotus Notes

@Lotus: Вы можете отправлять GET-аргументы, и они будут игнорироваться, если их ничего не ищет.
Дэвид Эйк

Ответы:


10

Согласно Google Make the Web Faster , страницы с параметрами запроса не кэшируются многими HTTP прокси.

Большинство прокси-серверов, особенно Squid, работающий до версии 3.0, не кэшируют ресурсы с "?" в их URL, даже если Cache-control: publicв ответе присутствует заголовок. Чтобы включить кэширование прокси для этих ресурсов, удалите строки запроса из ссылок на статические ресурсы и вместо этого закодируйте параметры в сами имена файлов.

Так styles.min.abcd1234.cssчто это предпочтительное решение. Вы можете использовать соответствующий механизм перезаписи URL, чтобы styles.min.abcd1234.cssсделать его styles.min.css?v=abcd1234прозрачным и простым в реализации .

Если вы поддерживаете только HTTPS, этот совет не применяется, поскольку прокси-серверы обычно не могут кэшировать страницы, которые обслуживаются по SSL.


2
Интересно, не устарела ли информация, касающаяся кэширования строки запроса и прокси-серверов? В этом контексте документы Google больше не ссылаются на строки запросов и прокси-серверы. Хотя примеры все же включают изменение самого имени файла. Squid 2.7 (2008) и 3.1 (2010) по сообщениям поддерживают кэширование строки запроса по умолчанию, и более ранние версии могут быть настроены для поддержки этого.
MrWhite

15

Используя версионирование в стиле GET, из пустого кэша несколько URL-адресов - например, style.css?v=123и style.css?v=456- вернут одно и то же содержимое. Однако я не вижу, что это будет проблематично, тем более что вы будете ссылаться только на один за раз.

Я думаю, вы найдете, что стиль GET гораздо проще поддерживать. Вам не нужны отдельные файлы: просто измените URL, и браузеры снова загрузят CSS.

ОБНОВЛЕНИЕ: при дальнейших исследованиях выясняется, что использование строки запроса может остановить кеширование файлов браузерами . Однако, если вы возвращаете правильные заголовки, такие как Expiresэто, не проблема.

ОБНОВЛЕНИЕ 2: принятый ответ указывает, что некоторые прокси не кэшируют файлы со строкой запроса. Однако это основано на старой информации; конкретная проблема, которую они упоминают в Squid, была исправлена ​​7 лет назад. Impressive Webs хорошо написали об этом.


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

1

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

Я говорю о том, какой метод вам проще поддерживать.


0

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

Оба метода потребуют модификации файлов, на которые ссылаются файлы css и js. Таким образом, в действительности это потребует перезагрузки сервера приложений после внесения изменений.

Есть ли лучший способ, где управление версиями статических файлов может осуществляться без перезагрузки сервера приложений?

в решении исключено следующее

  • изменение имен файлов css и js
  • передача запроса в параметре в URL

решение также не должно влиять на настройку cache-control или истекает.

Благодарность


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

Как отметил Дэвид, этот сайт не похож на другие форумы. Если вам нужно задать новый вопрос, не стесняйтесь нажать кнопку «задать вопрос»
Марк Хендерсон,

Это полезное уточнение. Если вы измените свою таблицу стилей, было бы предпочтительным сохранить имя и ссылку на нее, а не обновлять сотни ссылок на нее по всему сайту.
Марк Стосберг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.