Продолжу...
---
В итоге я нашел отличный конфиг для Expires (из проекта Mobile Boilerplate), кому нужно, сами можете заменить в своем .htaccess вместо того блока, что я дал выше
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 year"
# Data interchange
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/ld+json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
# Favicon (cannot be renamed!) and cursor images
ExpiresByType image/x-icon "access plus 1 week"
# HTML components (HTCs)
ExpiresByType text/x-component "access plus 1 month"
# HTML
ExpiresByType text/html "access plus 0 seconds"
# JavaScript
ExpiresByType application/javascript "access plus 1 year"
# Manifest files
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# Media
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
# Web feeds
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
# Web fonts
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
</IfModule>
У мну так
<ifModule mod_headers.c>
#кэшировать html и htm файлы на один день
<FilesMatch "\.(html|htm)$">
Header set Cache-Control "max-age=43200"
</FilesMatch>
#кэшировать css, javascript и текстовые файлы на одну неделю
<FilesMatch "\.(js|css|txt)$">
Header set Cache-Control "max-age=604800"
</FilesMatch>
#кэшировать флэш и изображения на месяц
<FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
#отключить кэширование
<FilesMatch "\.(php)$">
Header unset Cache-Control
</FilesMatch>
</IfModule>
<ifModule mod_expires.c>
ExpiresActive On
#по умолчанию кеш в 2 секунд
ExpiresDefault "access plus 2 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"
#кэшировать css, javascript и текстовые файлы на одну неделю
ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/javascript "access plus 604800 seconds"
ExpiresByType application/javascript "access plus 604800 seconds"
ExpiresByType application/x-javascript "access plus 604800 seconds"
ExpiresByType text/html "access plus 43200 seconds"
ExpiresByType application/xhtml+xml "access plus 6000 seconds"
</ifModule>
# BEGIN EXPIRES
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 days"
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/plain "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-icon "access plus 1 year"
ExpiresByType application/x-font-woff "access plus 1 year"
</IfModule>
# END EXPIRES
И что с этой фигнёй реально быстрее грузится сайт?
По идее, все должно было заработать, но тем не менее, проверка по PageSpeed опять показала, что кэширования на стороне клиента нет. Проверка заголовков по FireBug показала, что Expires все равно не работает и заголовки кэширования не отдаются.
Я начал искать причину и подозрение пало на наш сервер, а точнее на связку Apache + Nginx.
Это весьма распространенное решение, на большинстве хостингов все работает именно так.
И у меня возникло подозрение, что кэширующие заголовки режет Nginx, ведь выдает из Apache, который с клиентом общается не напрямую.
Дальнейшая проверка подтвердила мою догадку. Когда я отключил Nginx и пустил Апач напрямую, кэширование на стороне клиента сразу заработало.
Сразу возникла дилемма: а на кой тогда нужен Nginx, если он разгружает Апач, но замедляет работу сервера с клиентами, не давая нам управлять кэшированием?
Полез в Гугл на раскопки чужой мудрости, нашел некоторые варианты конфигов для Nginx, которые обеспечивают заголовки кэширования, но это все не то, нам надо, чтоб работал именно Expires у Апача, он очень хорошо делает свою работу и легко управляется через .htaccess
Не спешите каментить, щас напишу, как удалось решить проблему
# ValekS (08.01.2015 / 22:58)
И что с этой фигнёй реально быстрее грузится сайт?
Да, реально быстрее, если много графики и большие CSS, то НАМНОГО быстрее.
Так можно сразу в конфигах nginx кеширование прописать
В итоге проблема оказалась в конфигах Nginx, подробности ща опишу ниже...
===
Те, кто серьезно работают с настройками сервера и связками Apache + Nginx наверно знают, что есть такой трюк, как разгрузка Апача от всей статики.
Иными словами, все статические файлы типа картинок, стилей, джавы, видео, архивов и прочей ерунды, обрабатывает непосредственно Nginx, а запросы по РНР файлам передаются Апачу.
То есть, к примеру, если клиент запросил картинку logo.gif ее ему отдаст не Apache а непосредственно Nginx.
Вот тут и кроется несоответствие!!!
Ведь мы настраивали заголовки Expires именно на Апаче, а как он их выдаст, если картинку отдает сразу Nginx и запрос не доходит до Апача? Потому и не выдается заголовок на кэширование.
===
В итоге, проблему решил так:
Из настроек статики Nginx я убрал все картинки и стили (gif jpg png css), видео, архивы и все остальное оставил.
И после перезагрузки Nginx все заработало как надо.
З.Ы.
Если у Вас нет доступа к полным конфигам Nginx, просто выключите обработку статики и все.
# Swank (08.01.2015 / 23:05)
Так можно сразу в конфигах nginx кеширование прописать
Можно, но это хуже.
Конфигурировать Nginx тот еще геморой, там надо указывать каталог с картинками, а что делать, если они у тебя в разных местах?
Модуль Expires для Апача по функциям намного круче и удобнее управляется.
Посему, лучше картинки, джаву и стили не отдавать Nginx, а обрабатывать самим Апачем.
В итоге мы НАМНОГО выигрываем, у клиентов меньше трафика, страницы грузятся быстрее, да и сервер разгружается.