htaccess - Как заставить браузер клиента очистить кеш? - PullRequest
64 голосов
/ 02 декабря 2011

Для моего сайта у меня есть следующие правила 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

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

Ответы [ 11 ]

104 голосов
/ 04 декабря 2011

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

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

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

54 голосов
/ 26 августа 2013

Как уже говорилось в других ответах, изменение 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.

16 голосов
/ 06 декабря 2011

Я понял вашу проблему ...

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

В вашем <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

5 голосов
/ 08 декабря 2011

Нельзя заставить браузеры очищать кеш.

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

2 голосов
/ 19 мая 2014

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

<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 кеш, вы можете использовать инструмент для минимизации и запутывания скриптов, которые должны каждый раз генерировать случайное имя файла. Это заставит браузер перезагружать их с сервера тоже.

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

1 голос
/ 18 июля 2017

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

# 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>
1 голос
/ 02 июня 2017

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

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

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

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

1 голос
/ 31 октября 2014

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

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

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

1 голос
/ 10 сентября 2013

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

0 голосов
/ 17 ноября 2018

Это сработало для меня.

ищите это:

    DirectoryIndex index.php

заменить на это:

    DirectoryIndex something.php index.php

Загрузить и обновить страницу. Вы получите ошибку страницы.

просто измените его обратно на:

    DirectoryIndex index.php

перезагрузите и обновите страницу снова.
Я проверил это на всех своих устройствах, и это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...