Apache: установить максимальный возраст или истечь в .htaccess для каталога

У меня есть несколько каталогов с контентом, который никогда не изменится.

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

Я хотел бы скопировать тот же файл .htaccess в каждый каталог, если это возможно.

Если это возможно, вы порекомендовали бы max-age over expires или оба?

Ответ 1

Таким образом, это выглядит... Синтаксис файла .htaccess:

Header unset Last-Modified
FileETag none
ExpiresActive On
ExpiresDefault "access plus 1 years"

Это отключит Etags и включит кеш-контроль: max-age

Затем поместите этот файл .htaccess в каталог и все файлы (включая его подкаталоги будут кэшироваться в течение 1 года.

Я решил поместить весь свой файл, пригодный для кэширования, в один корневой каталог и отредактировать httpd.conf как

<Directory "C:\somedir\cache">
  Header unset Last-Modified
  FileETag none
  ExpiresActive On
  ExpiresDefault "access plus 1 years"
</Directory>

Я все еще в процессе тестирования. Я просто надеюсь, что это не отключит Etags для остальной части сайта. Пока это выглядит так, как будто это работает как запланировано.


ОБНОВЛЕНИЕ (через 6 месяцев):

Настройка ExpiresDefault и использование электронных тегов - лучшее, что нужно сделать.

в httpd.conf:

<Directory "C:\somedir\cache">
   ExpiresActive On
   ExpiresDefault "access plus 1 year"
</Directory>

Убедитесь, что "somedir" находится внутри корня apache (например, htdocs).

Разрешать электронные теги - это хорошо, потому что через 1 год браузер повторно проверит файл, передав e-tag. Веб-сервер отправит 304 - Not Modified и reset максимальный возраст до 1 года. Это очень эффективно.

В общем, вы можете посмотреть файл журнала apache и увидеть, что элементы в /cache dir начинаются один раз.

Примечание. Я обнаружил, что настройка Header append Cache-Control "public" в порядке, если вы хотите.


Окончательная версия:

Здесь окончательная версия: (просто добавьте это в нижней части httd.conf)

<Directory "C:\somedir\cache"">
   ExpiresActive On
   ExpiresDefault "access plus 1 year"
   Header append Cache-Control "public"
</Directory>

Проверка заголовка должна показать это:

Accept-Ranges:bytes
Cache-Control:max-age=31536000, public
Connection:Keep-Alive
Content-Language:en
Content-Length:746
Content-Type:text/css
Date:Thu, 29 May 2014 15:23:50 GMT
ETag:"240000000add63-2ea-4f4086d72ad01"
Expires:Fri, 29 May 2015 15:23:50 GMT
Keep-Alive:timeout=40, max=200
Last-Modified:Fri, 07 Mar 2014 18:28:59 GMT

Это будет:

  • Установите максимальный возраст в течение 1 года (наиболее рекомендуемый)
  • Отправить тег expires 1 год
  • Отправьте Etag, поэтому через 1 год браузер выполнит проверку etag
  • Пусть промежуточные устройства/службы кэширования знают, что они могут кэшировать файл в течение 1 года.

Ответ 2

FYI, если вы выполните то, что указано выше, и ваш Apache не перезагрузится, вы можете получить эту ошибку:

The Apache service named  reported the following error:
>>> Invalid command 'ExpiresActive', perhaps misspelled or defined by a module not included in the server configuration.

Вы можете найти эту ошибку, нажав "Пуск", введите "Управление компьютером", запустите его, в открывшемся дереве "Средство просмотра событий → Журналы Windows → Приложение". Это где я нашел ошибку выше.

Простое исправление, просто раскомментируйте эту строку в httpd.conf:

#LoadModule expires_module modules/mod_expires.so