Подтвердить что ты не робот

Htaccess - Как заставить браузер клиента очистить кеш?

Для моего сайта у меня есть следующие правила htaccess:

# BEGIN Gzip
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</IfModule>
# END Gzip

# BEGIN EXPIRES
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 10 days"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType text/plain "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType application/x-javascript "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType application/x-icon "access plus 1 year"
</IfModule>
# END EXPIRES

Я только что обновил свой сайт, и он выглядел все вялым, пока я не очистил свой кеш. Как заставить браузер клиента очищать кеш после обновления, чтобы пользователь мог видеть изменения?

4b9b3361

Ответ 1

Вы можете заставить браузеры кэшировать что-то, но

Вы не можете заставить браузеры очистить кеш.

Таким образом, единственным способом (AMAIK) является использование нового URL для ваших ресурсов. Что-то вроде версий.

Ответ 2

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

Аналогичным методом является просто добавить параметр версии в строку URL, которая является случайной строкой/номером или номером версии, и нацелить только измененные файлы.

Например, если вы измените свой CSS-сайт и он выглядит неуклюжим, пока вы не обновите силу, просто добавьте ?ver=1.1 в импорт CSS в начале файла. Это для браузера - это другой файл, но вам нужно изменить импорт, а не фактическое местоположение или имя файла.

например:

<link href="assets/css/style.css" rel="stylesheet" type="text/css" />

становится

<link href="assets/css/style.css?ver=1.1" rel="stylesheet" type="text/css" />

Отлично подходит для файлов javascript.

Ответ 3

У меня возникла ваша проблема...

Хотя мы можем полностью очистить кеш браузера клиента, но вы можете добавить код в свое приложение, чтобы ваши последние изменения отражались на клиентском браузере.

В <head>:

<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

Источник: http://goo.gl/JojsO

Ответ 4

Вы не можете заставить браузеры очистить кеш.

Ваш .html файл, кажется, перезагружается раньше, чем истекает через 10 дней. Вам нужно обновить ваш .html файл и переместить все ваши файлы в новую папку, например version-2/, или добавить идентификатор версии для каждого файла, например mypicture-2.jpg. Затем вы ссылаетесь на эти новые файлы в вашем .html файле, и браузер будет загружать их снова, потому что местоположение изменилось.

Ответ 5

Вы можете сказать, что браузер никогда не кэширует ваш сайт, вставив следующий код в заголовок

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

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

Надеюсь, это поможет.

Ответ 6

Вы можете установить "доступ плюс 1 секунда", и таким образом он будет обновляться при следующем входе пользователя в сайт. Сохраните настройку в течение одного месяца.

Ответ 7

Наиболее простым направлением является добавление файла к запросу. например,

myfile.txt 2014-10-30-13: 12: 33

версия по дате.

Ответ 8

Измените имя файла .CSS. Загрузите страницу, а затем снова измените файл в оригинальном имени, которое оно работает для меня.

Ответ 9

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

У меня нет определенного номера версии для этого файла, поэтому я просто хэш текущей даты и времени (час и минута) и передаю его как номер версии:

<script src="/js/panel/app.js?v={{ substr(md5(date("Y-m-d_Hi")),10,18) }}"></script>

Мне нужно, чтобы он загружался каждую минуту, но вы можете решить, когда его нужно перезагрузить.

Ответ 10

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

# Rewrite all requests for JS and CSS files to files of the same name, without
# any numbers in them. This lets the JS and CSS be force out of cache easily
# by putting a number at the end of the filename
# e.g. a request for static/js/site-52.js will get the file static/js/site.js instead.
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^static/(js|css)/([a-z]+)-([0-9]+)\.(js|css)$ /site/$1/$2.$4 [R=302,NC,L]
</IfModule>

Конечно, чем выше в вашей структуре папок вы делаете такой подход, тем больше вы выкидываете вещи из кеша с простым изменением.

Так, например, если вы храните весь css и javascript своего сайта в одной основной папке

/assets/js
/assets/css
/assets/...

Затем вы можете начать ссылаться на него как "assets-XXX" в свой html и использовать такое правило, чтобы выбить все содержимое ресурсов из кеша.

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^assets-([a-z0-9]+)/(.*) /$2 [R=302,NC,L]
</IfModule> 

Обратите внимание, что если вы это сделаете, после того, как вы его заработаете, измените значение 302 на 301, а затем начнет кэширование. Когда он будет 302, он не будет кэшировать на уровне браузера, потому что это временная переадресация. Если вы сделаете это так, то вы можете увеличить время истечения срока действия до 30 дней для всех активов, так как вы можете легко выкинуть вещи из кеша, просто изменив имя папки на странице входа.

<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresDefault A2592000
</IfModule>