Остановка клиента, видящего кэшированную веб-страницу

Я нашел это сложным словом, поэтому, пожалуйста, потерпите меня.

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

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

Я знаю, что для файлов javascript и файлов css вы можете изменить имя файла, чтобы браузер рассматривал его как новый файл и повторно загружал его, например. myCssFilev1.2.css, а как насчет HTML?


person user1528274    schedule 16.07.2012    source источник
comment
Я думаю, вы можете использовать параметры кеша в заголовках html askapache.com/htaccess/ apache-speed-cache-control.html   -  person Ozair Kafray    schedule 16.07.2012


Ответы (4)


Для этого есть пара метатегов:

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

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

ИЗМЕНИТЬ

Как заметил Ариэль, с этим нужно быть осторожным. Если это ситуация с высокой нагрузкой, вы, вероятно, захотите найти другое решение. Можно попробовать найти "золотую середину", но подправив параметры (установив истечение срока действия или max-age управления кешем на какое-то значение). Однако, если у вас нет безумной нагрузки на сервер, то это должно быть хорошо.

person Doa    schedule 16.07.2012
comment
Да, не делайте этого, если вы не хотите, чтобы вообще ничего кэшировалось. А ты этого не хочешь! (Если вам не нравятся очень медленные страницы.) - person Ariel; 16.07.2012
comment
Ариэль, вопрос в том, есть ли способ заставить клиентский браузер автоматически обновлять весь контент. Боюсь, это означает, что никакого чечинга. - person Doa; 16.07.2012
comment
По крайней мере, не устанавливайте мгновенный срок действия. Кэш на 1 день или даже на 1 час очень поможет. - person Ariel; 16.07.2012
comment
Еще одна вещь: если это страница PHP, не устанавливайте их в мета-элементах, используйте функцию header(). Для HTML-страниц метаэлементы проще. - person Ariel; 16.07.2012
comment
спасибо всем, я думаю, что лучше всего установить короткое время истечения срока действия, как говорит Ариэль, но через htaccess вы можете установить разные типы файлов для разных сроков действия. Таким образом, html можно установить на очень низкий уровень, а изображения — на более высокий. Пользователь не увидит мгновенных обновлений, но я думаю, что это работает. - person user1528274; 17.07.2012

Да. Скажем, у вас есть javascript.

Do:

<SCRIPT src="file.js?<?=filemtime('file.js')?>"></SCRIPT>

Это добавляет время модификации файла к URL-адресу файла. Поэтому, когда вы меняете файл, для браузера он будет выглядеть как новый файл и не будет кэшироваться.

Имейте в виду, что постоянные вызовы filemtime могут замедлить работу.

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

person Ariel    schedule 16.07.2012
comment
Обратите внимание, что OP говорит, что я знаю, что для файлов javascript и файлов css вы можете изменить имя файла, чтобы браузер рассматривал его как новый файл и повторно загружал его, например. myCssFilev1.2.css, а как насчет реального HTML? То, что вы предлагаете, предназначено для JS и CSS, а не для HTML. - person Doa; 16.07.2012
comment
@dow Вы можете сделать то же самое для html-файла - просто поместите этот код в ссылки на html-страницы. Вот почему я предложил написать функцию, чтобы сделать это быстро и легко. - person Ariel; 16.07.2012
comment
Как насчет страницы, на которую попадают люди? Автоматически перенаправлять на PHP_SELF?[randomnum] с помощью mod_rewrite? Это немного чересчур, не так ли? Хотя идея интересная. - person Doa; 16.07.2012
comment
@ Доу, почему бы и нет? И вам не нужен mod_rewrite, вы можете сделать это с помощью PHP. Для дополнительной оценки PHP должен прочитать поле URL-адреса filemtime, которое вы передали, и если оно не соответствует текущему времени модификации файла, вызовите перезагрузку с помощью header('Location:..). Тогда вам не нужно беспокоиться о ссылках с закладками. Вы даже можете исключить поле из ссылок, просто оставьте их пустыми, а затем PHP проверит, было ли поле отправлено в URL-адресе, если не перезагрузит его, как это было бы для старого поля (хотя это замедлит работу на постоянно делает двойные запросы по каждой ссылке, и это работает только на PHP-страницах). - person Ariel; 16.07.2012

Это сложнее, чем кажется. Я искренне считаю, что указание пользователю очистить кеш браузера — самый простой способ. В настоящее время нажатие Ctrl+Shift+Del выполняется быстро и работает в большинстве браузеров, включая Internet Explorer.

person Álvaro González    schedule 16.07.2012
comment
Пожалуйста, не делай этого. Вместо этого используйте Shift-Reload. Не заставляйте пользователей очищать свои кеши без причины. Обычная перезагрузка также часто работает. - person Ariel; 16.07.2012

Заголовок HTTP Last-Modified и Etag используются для уменьшения трафика в сети.

Браузер запрашивает веб-сервер с заголовком Last-Modified. Если дата-время совпадает со временем файла сервера, сервер просто ответит 304. Или время отличается, ответ сервера 200 и полный контент.

Etag делает тот же процесс.

Есть еще такие, как If-Modified-Since , If-Unmodified-Since, подробнее см. etag, и rfc2616

person kimjxie    schedule 16.07.2012