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

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

10 55

10 ответов:

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

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

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

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

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

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

в своем <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

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

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

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

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

надеюсь, что это помогает.

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

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

мой_файл.txt?2014-10-30-13:12:33

управление версиями по дате.

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

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

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

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

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

# 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//. [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]+)/(.*) / [R=302,NC,L]
</IfModule> 

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

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

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