Настройка кеширования статики в Apache

Далеко не все знают, что по умолчанию в Apache кеширование отключено. Это означает, что каждый раз, когда пользователь просматривает страницу, ему приходится каждый раз скачивать все файлы сайта: и CSS, и JavaScript, и картинки. Это создает лишнюю нагрузку на сервер, расходует траффик пользователя и замедляет работу сайта. Что же сделать, чтобы этого не было? Очень просто: прописать в настройках Apache выдачу заголовков, которые позволят использовать кеширование на стороне пользователя. Делается это очень просто:

либо в файл apache2.conf, либо в .htaccess на каждом сайте прописываем следующие директивы:

<ifModule mod_deflate.c> 
# Включение GZIP-сжатия для различных типов файлов: TXT, SVG, RSS, javascript
   AddOutputFilterByType DEFLATE text/html text/xml text/css text/plain
   AddOutputFilterByType DEFLATE image/svg+xml application/xhtml+xml application/xml
   AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml
   AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript application/json
   AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-truetype application/x-font-opentype application/font-woff
   BrowserMatch ^Mozilla/4 gzip-only-text/html
   BrowserMatch ^Mozilla/4\.0[678] no-gzip
   BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</ifModule>

<ifModule mod_expires.c>  
#включение заголовка Expires, указывающего время устаревания файла
   ExpiresActive On
   ExpiresDefault "access plus 3600 seconds"
# по умолчанию время устаревания составляет час, но для некоторых типов файлов мы его переопределим
   ExpiresByType image/x-icon "access plus 2592000 seconds"
   ExpiresByType image/jpeg "access plus 2592000 seconds"
   ExpiresByType image/png "access plus 2592000 seconds"
   ExpiresByType image/gif "access plus 2592000 seconds"
   ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
   ExpiresByType text/css "access plus 604800 seconds"
   ExpiresByType text/javascript "access plus 604800 seconds"
ExpiresByType image/svg+xml "access plus 2592000 seconds"
ExpiresByType application/x-font-ttf "access plus 2592000 seconds"
ExpiresByType application/x-font-truetype "access plus 2592000 seconds"
ExpiresByType application/x-font-opentype "access plus 2592000 seconds"
ExpiresByType application/font-woff "access plus 2592000 seconds"
ExpiresByType application/font-woff2 "access plus 2592000 seconds"
ExpiresByType application/vnd.ms-fontobject "access plus 2592000 seconds"
ExpiresByType application/font-sfnt "access plus 2592000 seconds"
   ExpiresByType application/javascript "access plus 604800 seconds"
   ExpiresByType application/x-javascript "access plus 604800 seconds"
   ExpiresByType text/html "access plus 600 seconds"
   ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>

<ifModule mod_headers.c>
# Самая главная часть: выдача заголовка, разрешающего кеш определенных типов файлов
   <filesMatch "\.(ico|jpe?g|png|gif|swf|svg|webp|ttf|otf|woff|woff2|eot|sfnt)$">
     Header set Cache-Control "max-age=25920000"
   </filesMatch>
   <filesMatch "\.(css)$">
     Header set Cache-Control "max-age=25920000"
   </filesMatch>
   <filesMatch "\.(js)$">
     Header set Cache-Control "max-age=25920000"
   </filesMatch>
</ifModule>

Если у вас свой VDS, необходимо проверить, что Apache запускается с модулями headers, expires, deflate. В Debian это можно сделать с помощью утилиты a2enmod:
# a2enmod headers expires deflate В других системах придется отредактировать файл apache2.conf и посмотреть, есть ли там директива LoadModule для соответствующих модулей.