Какой лучший способ для версии 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.