Тесты под Konqueror показали, что этот браузер не понимает архивированных файлов (CSS и JavaScript), поэтому чтобы уберечь десятую долю процента посетителей от сердечного приступа (когда они увидят сайт без соответствующих стилей), стоит добавить его в этот набор правил. Аналогично и «старым» браузерам (которые явно указывают, что не понимают архивов) отдается неархивированное содержание.
<IfModule mod_rewrite.c> RewriteEngine On # перенаправляем Konquerorи «старые браузеры» RewriteCond %{HTTP:Accept-encoding} !gzip [OR] RewriteCond %{HTTP_USER_AGENT} Konqueror RewriteRule ^(.*)\.(css|js)$ $1.nogzip.$2 [QSA,L] </IfModule>
Вся вышеуказанная конструкция «обернута» условием наличия на сервере подключенного mod_rewrite
. Если он отсутствует, то это сразу станет видно на заявленных браузерах (перестанут отображаться стили и отрабатывать скрипты). Иначе Apache просто не сможет запуститься, т. к. RewriteEngine
не будет объявлен.
Дополнительно к заявленной логике необходимо выставить ряд заголовков для отдаваемых файлов. В частности, Vary
и Cache-control
касаются локальных проксирующих серверов, которые не должны кэшировать эти файлы, а пропускать их дальше к пользователю, не обрезая при этом заголовок User-Agent
(иначе наш сервер никак не узнает, можно ли отдавать архивированную копию файла или нет).
<IfModule mod_headers.c> Header append Vary User-Agent # выставляем для всех css/js файлов Content-Encoding <FilesMatch .*\.(js|css)$> Header set Content-Encoding: gzip Header set Cache-control: private </FilesMatch> # сбрасываем Content-Encoding в том случае, если отдаем не архив <FilesMatch .*\.nogzip\.(js|css)$> Header unset Content-Encoding </FilesMatch> </IfModule>
В итоге для всех файлов, которые мы отдаем как архивы, дополнительно объявляется Content-Encoding
, а для их неархивированных копий этот заголовок сбрасывается. Чем и достигается полная работоспособность данного решения.