Как предотвратить кеширование файлов http в Apache httpd (MAMP)

141

Я разрабатываю одностраничное приложение Javascript в MAMP. Мои файлы шаблонов JavaScript и HTML кэшируются между запросами.

Есть ли простой способ указать в MAMP, что я хочу предотвратить кеширование файлов http? Возможно с .htaccessнапильником? Где мне разместить .htaccessили изменить виртуальный хост для MAMP на Mac?

dmck
источник

Ответы:

321

Пробовали это? Должен работать как в .htaccess, так httpd.confи в VirtualHost(обычно помещается, httpd-vhosts.confесли вы включили его из своего httpd.conf)

<filesMatch "\.(html|htm|js|css)$">
  FileETag None
  <ifModule mod_headers.c>
     Header unset ETag
     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
  </ifModule>
</filesMatch>

100% запретить кеширование файлов

Это похоже на то, как в объявлениях Google используется заголовок Cache-Control: private, x-gzip-ok = ""> для предотвращения кеширования рекламы прокси-серверами и клиентами.

С http://www.askapache.com/htaccess/using-http-headers-with-htaccess.html

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

Чарли Руденстол
источник
2
Спасибо, это очень хорошо работает с файлом .htaccess. Я вижу параметры управления кешем, когда проверяю заголовки, и мои файлы отображаются с http 200 вместо 304 между запросами, как раз то, что мне нужно.
dmck
2
Не забудьте добавить команду LoadModule. LoadModule headers_module lib/modules/mod_headers.so
Spenhouet
Могу ли я применить этот заголовок ко всем типам файлов вместо того, чтобы определять расширения одно за другим?
Thariq Nugrohotomo
1
@ThariqNugrohotomo Да, это возможно! Это регулярное выражение, вы можете попробовать <filesMatch "\.+">или<filesMatch ^>
Чарли Руденстол
Я использую не MAMP, а Apache на веб-сервере. Мне также пришлось включить заголовки и модули с истекающим сроком действия в моей установке Apache, набрав «sudo a2enmod headers» и «sudo a2enmod expires», а затем перезапустите sudo service apache2. Команды / теги LoadModule и IfModule не были необходимы - просто опустите части тега IfModule в квадратных скобках выше, но все же введите настройки заголовка между ними. -
andruo11
5

На основе примера здесь: http://drupal.org/node/550488

Следующее, вероятно, будет работать в .htaccess

 <IfModule mod_expires.c>
   # Enable expirations.
   ExpiresActive On

   # Cache all files for 2 weeks after access (A).
   ExpiresDefault A1209600

  <FilesMatch (\.js|\.html)$>
     ExpiresActive Off
  </FilesMatch>
 </IfModule>
Фрэнк Фармер
источник
К сожалению, это не работает, когда я помещаю файл .htaccess в каталог своего проекта. Я не уверен, что mod_expires активен.
dmck
5
@dmck: удалить <IfModule mod_expires.c>и </IfModule>раздел .. если mod_expires не включен, то вы получите ошибку , вместо этих директив тихо игнорируются.
Stennie
В каталоге проекта любая небольшая синтаксическая ошибка может вызвать ошибку 500.
SDsolar
3

У меня была такая же проблема, но я нашел здесь хорошее решение: прекратить кеширование для PHP 5.5.3 в MAMP

В основном найдите файл php.ini и закомментируйте строки OPCache. Я надеюсь, что этот альтернативный ответ поможет и другим.

акарито
источник
3
это касается кеширования PHP на стороне сервера, также известного как OPCache. Речь идет о файлах, кэшируемых браузером, которые запрашиваются по HTTP.
Flion
2

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

<?php header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); ?>

(взято из: Ответ на переполнение стека от @brianegge , где также объясняется решение mod_expires)

Теперь это не будет работать для статических файлов , таких как ваши файлы javascript. Что касается статических файлов, между браузером и исходным файлом есть только apache (без какого-либо модуля срока действия). Чтобы предотвратить кеширование файлов javascript, которое выполняется в вашем браузере, вы можете использовать случайный токен в конце URL-адреса js, примерно так ?rd=45642111, чтобы URL-адрес выглядел так:

<script type="texte/javascript" src="my/url/myjs.js?rd=4221159546">

Если этот URL-адрес на странице создается файлом PHP, вы можете просто добавить случайную часть с помощью PHP. Этот способ рандомизации URL-адреса путем простого добавления параметров случайной строки запроса является базовой вещью, например, при настройке без кеширования запроса ajax jQuery. Браузер никогда не будет считать 2 URL-адреса с разными строками запроса одинаковыми и никогда не будет использовать кешированную версию.

РЕДАКТИРОВАТЬ

Обратите внимание, что вы должны также протестировать mod_headers . Если у вас есть mod_headers, вы можете установить заголовки Expires напрямую с помощью ключевого слова Header .

Regilero
источник
Спасибо, к сожалению, я не использую файлы PHP. Я изучу mod_headers и установлю mod_expires.
dmck
Как насчет предотвращения кеширования файлов CSS?
Аарон Франке
1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>
Бипин Бахугуна
источник
Это не очень качественный ответ. Постарайтесь подробно объяснить, каковы шаги для решения проблемы, указанной в OP.
leopal