Настройка кеширования через .htaccess
Объяснение Last-modified, Etag, Expired, Cache-control
Проверка инструментом Pagespeed
Включение динамического gzip-сжатия — через mod_deflate
, статического — необходимо подготовить сжатые версии файлов и с помощью .htaccess
подменять на лету реальные файлы сжатыми:
- .htaccess
# Перенаправление на gzip файлы AddEncoding gzip .gz <filesMatch "\.js.gz$"> ForceType text/javascript Header set Content-Encoding: gzip </filesMatch> <filesMatch "\.js$"> RewriteEngine On RewriteCond %{HTTP_USER_AGENT} !".*Safari.*" RewriteCond %{HTTP:Accept-Encoding} gzip RewriteCond %{REQUEST_FILENAME}.gz -f RewriteRule (.*)\.js$ $1\.js.gz [L] ForceType text/javascript </filesMatch> <filesMatch "\.css.gz$"> ForceType text/css Header set Content-Encoding: gzip </filesMatch> <filesMatch "\.css$"> RewriteEngine On RewriteCond %{HTTP_USER_AGENT} !".
Взято отсюда
Обычный .htaccess
файл по принципу «все включено»:
- .htaccess
# Cache-Control <ifModule mod_headers.c> # 30 дней <filesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$"> Header set Cache-Control "max-age=2592000, public" </filesMatch> # 30 дней <filesMatch "\.(css|js)$"> Header set Cache-Control "max-age=2592000, public" </filesMatch> # 2 дня <filesMatch "\.(xml|txt)$"> Header set Cache-Control "max-age=172800, public, must-revalidate" </filesMatch> </ifModule> <ifModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 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 216000 seconds" ExpiresByType application/javascript "access plus 216000 seconds" ExpiresByType application/x-javascript "access plus 216000 seconds" ExpiresByType text/html "access plus 600 seconds" ExpiresByType application/xhtml+xml "access plus 600 seconds" </ifModule> <IfModule mod_deflate.
Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html </IfModule> </IfModule>
Проверка включения сжатия:
curl -H "Accept-Encoding: gzip,deflate" --head http://mysite.ru
Должен отдаваться заголовок:
Content-Encoding: gzip
Как увеличить скорость загрузки сайта средствами .htaccess
Одной из важных характеристик сайта является скорость загрузки. Каким бы функциональным, красивым и информационно наполненным сайт ни был, если страницы сайта открываются по 5-10 секунд, постоянных посетителей у сайта не будет. Найдутся подобные, но работающие быстрее, сайты. И к тому же медленный сайт будет хуже «выдаваться» в поиске, ведь с недавних пор скорость загрузки сайтов стала одним из параметров поискового алгоритма Google.
Для оценки скорости загрузки сайта обычно пользуются плагинами браузера или специальными онлайн сервисами. Из плагинов для браузера отмечу Page Speed для Firefox.
Вы можете потратить кучу времени на оптимизацию движка вашего сайта, а тем временем существует простой и быстрый способ ускорить загрузку сайта, а кроме того сэкономить на трафике. Нужно просто сделать соответствующие настройки веб-сервера apache. Для этого необязательно иметь доступ к конфигам апача, достаточно будет файла .htaccess.
Включаем сжатие.
Для включения сжатия файлов с расширениями *.css, *.js, *.html, *.html, *.xhtml, *.php добавляем в .htaccess следующие строки.
<IfModule mod_deflate.c> <FilesMatch "\.(css|js|x?html?|php)$"> SetOutputFilter DEFLATE </FilesMatch> </IfModule>
Включаем кэширование.
Добавляем время жизни для файлов:
<IfModule mod_expires.c> 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 216000 seconds" ExpiresByType application/x-javascript "access plus 604800 seconds" ExpiresByType text/html "access plus 3600 seconds" ExpiresByType application/xhtml+xml "access plus 3600 seconds" </IfModule>
Добавляем управляющие команды для кэширущих систем (теперь на всех публичных кэширующих системах картинки будут кешироваться в течении 1 месяца, а файлы стилей и javascript — в течении недели).
<IfModule mod_headers.c> <FilesMatch "\.(ico|jpe?g|png|gif|swf)$"> Header set Cache-Control "max-age=2592000, public" </FilesMatch> <FilesMatch "\.(css)$"> Header set Cache-Control "max-age=604800, public" </FilesMatch> <FilesMatch "\.(js)$"> Header set Cache-Control "max-age=216000, private" </FilesMatch> <FilesMatch "\.(x?html?|php)$"> Header set Cache-Control "max-age=3600, private, must-revalidate" </FilesMatch> </IfModule>
Теперь при последовательном просмотре вашего сайта не будут загружаться ранее загруженные таблицы стилей, изображения и файлы с javascript.
Выключаем проверку объектных тегов ETag.
Объектные теги Etag — это механизм проверки на наличие новой версии кэшированного файла. Если удалить заголовок ETag, то браузеры и кэширующие сервера не будут проверять наличие новых версий кэшированных файлов. Т.е. они будут полагаться только на заголовки Cache-Control
и Expires
. Для html-страниц не рекомендуется отключать ETag. Ниже приведены строки, которые нужно добавить в .htaccess:
<ifModule mod_headers.c> <filesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header unset ETag FileETag None </filesMatch> </ifModule>
Удаляем заголовок Last-Modified.
Кроме того, можно удалить запросы браузера If-Modified-Since и If-None-Match, а также ответы на них 304 Not Modified. Это можно сделать добавив следующие строки:
<ifModule mod_headers.c> Header unset Last-Modified </ifModule>
Удаление заголовка Last-Modified
приводит к тому, что проверка на измененное содержание не осуществляется до тех пор пока об этом не объявит заголовок Expires
.
Добавив все вышеперечисленное в файл .htaccess вы увеличите скорость загрузки вашего сайта и уменьшите трафик.
По материалам статей: 20+ правил .htaccess, которые должен знать каждый разработчик и Оценка скорости загрузки сайта.
28 мая 2010 Дмитрий в рубрике вебдев . Темы: apache, оптимизация | [4]
Поделиться в FacebookДобавить в TwitterДобавить в TelegramОставить комментарий
apache — Last-Modified не работает для .htaccess
Задавать вопрос
спросил
Изменено 9 лет, 2 месяца назад
Просмотрено 15 тысяч раз
Я пытаюсь внедрить кэширование в браузере и следовать рекомендациям Google PageSpeed по установке Last-Modified для данных, которые «достаточно далеко в прошлом». У меня в .htaccess есть следующее:
Последнее изменение набора заголовков "Пт, 01 января 2010 г. , 12:00:00 по Гринвичу"
На моем сервере установлены mod_headers.
К сожалению, Google PageSpeed по-прежнему жалуется и предупреждает меня:
Использовать кеширование браузера Следующие кэшируемые ресурсы имеют короткий срок действия. Укажите срок действия как минимум через одну неделю для следующих ресурсов:
А затем список PNG, GIF, JPG и т. д. Yahoo YSlow говорит в основном то же самое.
Глядя на заголовки ответов одного из моих ресурсов, которые должны кэшироваться, я вижу это:
Дата: вторник, 19 октября 2010 г., 20:12:04 по Гринвичу. Сервер: Apache/2.2.14 (Ubuntu) Последнее изменение: вторник, 07 сентября 2010 г., 23:51:33 GMT Метка: "2e0e34-2a43-48fb413a96a20" Допустимые диапазоны: байты Длина содержимого: 10819 Тип содержимого: изображение/png
Как видите, данные Last-Modified не соответствуют тому, что я указал в .htaccess.
Есть идеи, что я делаю неправильно?
- apache
- .
htaccess
- заголовок
- http-заголовки
- httpd.conf
Удаление Last-Modified
— это не то, что запрашивает Google PageSpeed. Он хочет видеть следующие заголовки в ответе ваших серверов, когда браузеры запрашивают статические файлы:
Cache-Control max-age=... Истекает...
вместо точек сервер расставит значения.
Для этого вам просто нужно добавить к .htaccess
следующие строки:
ExpiresActive On ExpiresDefault "доступ плюс 1 год" Заголовок добавляет Cache-Control "public"
Вы увидите, что Google PageSpeed перестал жаловаться.
Рассматривали ли вы просто использование unset Last-Modified?
Заголовок удален Last-Modified
Раздел FilesMatch выглядит нормально, так что, вероятно, это просто некоторая возня с набором заголовков. Черт, может быть, даже с учетом регистра. Попробуйте
Набор заголовков
вместо Набор заголовков
Если это не то, что вам нужно, дайте мне знать, и я подумаю об этом немного подробнее. Отключение должно работать,
4Это работает:
1# Включить истечение срока действия ExpiresActive On # Директива по умолчанию ExpiresDefault "доступ плюс 1 месяц" # Мой фавикон ExpiresByType image/x-icon "доступ плюс 1 год" # Изображений ExpiresByType image/gif "Доступ плюс 1 месяц" ExpiresByType image/png "доступ плюс 1 месяц" ExpiresByType image/jpg "Доступ плюс 1 месяц" ExpiresByType image/jpeg "Доступ плюс 1 месяц" # CSS ExpiresByType text/css "доступ 1 месяц" # Джаваскрипт Приложение ExpiresByType/javascript "доступ плюс 1 год"
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя адрес электронной почты и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
.htaccess — проблема кэширования htaccess «Заголовок удален последним изменением»
Задавать вопрос
спросил
Изменено 4 года, 11 месяцев назад
Просмотрено 13 тысяч раз
Я пытаюсь настроить некоторые параметры управления кешем в файле htaccess.
На данный момент это выглядит так:
Заголовок установил Cache-Control "max-age=2592000, public, must-revalidate" ETag заголовка не установлен FileETag Нет
Однако я читал (и хотел добавить) о том, что заголовок не установлен Last-Modified, поэтому это будет что-то вроде:
(flv|gif|jpg|jpeg|png|ico|swf|css|js |html|pdf)$"> Заголовок установил Cache-Control "max-age=2592000 г., публичный, необходимо подтвердить" Заголовок удален Last-Modified ETag заголовка не установлен FileETag Нет
Однако при использовании этого (согласно Firebug) вообще ничего не загружается из кеша (в то время как первый метод загружает все)
Я делаю что-то не так? Синтаксис вроде правильный.
A.
- .htaccess
- кэширование
- последнее изменение
Синтаксис правильный, но использование — нет. Согласно «Советам по скорости: удалить заголовок Last-Modified», найденному здесь: http://www.askapache.com/htaccess/apache-speed-last-modified.html
Если вы удалите заголовок Last-Modified и ETag, вы полностью устраните запросы If-Modified-Since и If-None-Match и их ответы 304 Not Modified, поэтому файл будет оставаться в кэше без проверки обновлений до тех пор, пока заголовок Expires не укажет доступен новый контент!
Также:
При удалении заголовков ETag и Last-Modified из ваших статических файлов (изображений, javascript, css) браузеры и кэши не смогут проверить кешированную версию файла по сравнению с реальной версией.