Необходимые модули Apache2Для включения кеширования нам нужен модуль mod_deflate , для кеширования - mod_headers или mod_expires . Также mod_headers вам пригодится чтобы удалять заголовок ETag, он лишний и могут быть проблемы с кешированием через mod_header при включенном сжатии. Для включение выполните: sudo a2enmod deflate headers expires
sudo /etc/init.d/apache2 restart
Для отключения модулей воспользуйтесь командой a2dismod : sudo a2dismod deflate # пример отключения модуля mod_deflate
sudo /etc/init.d/apache2 restart
Итоговый .htaccessСразу
приведу пример файла .htaccess, в котором настроено кеширование и
сжатие. Файл будет содержать краткие примечания, а ниже разберем все
директивы и правила более детально. ### Сжать ответ сервера для перечисленных MIME типов
<ifModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/plain text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript
AddOutputFilterByType DEFLATE text/xml application/xml application/xhtml+xml application/rss+xml
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon
</ifModule>
</ifModule>
### Способ #1
### Подсказать браузеру схему кеширования через заголовки в ответе сервера
<ifModule mod_headers.c>
# 43200 - день, 604800 - неделя, 2592000 - месяц
<FilesMatch "\.(html|js|css)$">
Header set Cache-Control "max-age=2592000"
#Header unset Last-Modified
</FilesMatch>
<Files *.txt>
Header add Cache-Control "max-age=43200"
</Files>
<FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
# отключить кэширование
Header unset Cache-Control
</FilesMatch>
</IfModule>
### Способ #2
### Подсказать браузеру схему кеширования через заголовки в ответе сервера
<IfModule mod_expires.c>
# Enable expires
ExpiresActive On
# Default a cache expiration
ExpiresDefault "access plus 10 month"
# Images
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
# CSS, JavaScript
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType text/javascript "access plus 1 year"
</IfModule>
### Удалить заголовок ETag (иначе есть проблемы с кешированием при включенном сжатии)
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
ПримечаниеFilesMatch и Files ~ сопоставляют шаблон только с именем файла, поэтому вы не можете указывать пути к файлам в этих директивах. Чтобы указать область видимости кеша, используйте следующие правила: Header set Cache-Control "max-age=2592000"
Header append Cache-Control "public"
// то же самое в одну строку
Header set Cache-Control "max-age=2592000, public"
gzip-сжатиеApache2 больше не поддерживает модуль mod_gzip, теперь основным модулем является mod_deflate, который мы включили ранее. Чтобы проверить что сжатие работает - убедитесь что ответ содержит заголовок Content-Encoding: Content-Encoding gzip
Сжатие может быть настроено для определенных MIME-типов файлов, за это отвечает правило AddOutputFilterByType . Внимание!Модуль deflate при сжатии может удалять заголовок Content-Length, поскольку длина сжатого ответа неизвестна на момент передачи заголовков. Однако, при удалении из ответа заголовка ETag - ситуация нормализуется. Почему? ПримечаниеСжимать изображения и видео файлы особого смысла нет - толку это даст мало, поскольку jpeg или gif уже сами по себе являются сжатыми форматами. КешированиеДля кеширования мы активировали модули mod_headers и mod_expires . Эти модули позволяют устанавливать заголовки в ответе сервера и подсказать браузеру схему кеширования. Внимание!Я замечал не понятное для меня поведение при включении mod_deflate и настройке кеширования через mod_headers . Пропадал заголовок Content-Length и кеширование переставало работать. Решение нашлось - удаление заголовка из ответа: <IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
В случае с mod_expires сжатие и кеширование работало нормально даже с выключенным модулем mod_headers. Отпишитесь, если вы знаете почему происходит так.
|