Як запобігти кешування файлів http у Apache httpd (MAMP)


139

Я розробляю програму Javascript для однієї сторінки в MAMP. Мої файли шаблонів JavaScript та HTML отримують кешування між запитами.

Чи є простий спосіб вказати в MAMP, що я хочу запобігти кешування файлів http? Можливо, з .htaccessфайлом? Де розміщувати .htaccessабо змінювати віртуальний хост для MAMP на Mac?

Відповіді:


318

Пробували це? Повинен працювати в обох .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 ^>
Чарлі Rudenstål

Я не використовую MAMP, але Apache на веб-сервері. Мені довелося також включити заголовки та закінчувати модулі на моїй установці Apache, ввівши "заголовки sudo a2enmod" та "sudo a2enmod закінчується", а потім перезапустити службу sudo 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 не ввімкнено, ви отримаєте помилку замість тих директив, які тихо ігноруються.
Стенні

У каталозі проекту будь-яка незначна синтаксична помилка тут може спричинити помилку 500.
SDsolar

3

У мене була така ж проблема, але я знайшов тут хороше рішення: Зупиніть кешування PHP 5.5.3 в MAMP

В основному знайдіть файл php.ini та прокоментуйте рядки OPCache. Я сподіваюся, що ця альтернативна відповідь допомагає і іншим.


3
тобто про кешування PHP на стороні сервера, він же OPCache. Питання стосується файлів, які кешується браузером, які запитуються через HTTP.
Фліон

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-адресами, що мають різні рядки запитів, однаковими, і ніколи не використовуватиме кешовану версію.

EDIT

Зауважте, що ви повинні перевірити mod_headers . Якщо у вас є mod_headers, ви можете встановити заголовки Expires безпосередньо за допомогою ключового слова Header .


Дякую, на жаль, я не використовую жодних PHP-файлів. Я вивчу mod_headers та встановлюю mod_expires.
dmck

А як щодо запобігання кешування файлів CSS?
Аарон Франке

1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>

Це не дуже якісна відповідь. Спробуйте детально пояснити, які кроки для вирішення питання, про яке повідомляється в ОП.
leopal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.