В результате поисков в интернете и экспериментов доказано, что такая конфигурация работает:
В файле .htaccess (в корне сайта) сразу после
RewriteEngine on
добавил:
RewriteRule ^(.*\.js\.gz)$ - [L]
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.*)$ $1.gz
Упаковал *.js файл в *.js.gz и закачал на сервер в ту же папку, где был оригинальный JS-файл.
Открыл браузер загрузил страницу и посмотрел заголовки запроса:
- Response Headers
- Date Wed, 19 Mar 2008 12:32:09 GMT
- Server Apache
- Cache-Control max-age=1209600
- Expires Wed, 02 Apr 2008 12:32:09 GMT
- Last-Modified Wed, 19 Mar 2008 12:31:38 GMT
- Etag "bdcf97-87d-47e107aa"
- Accept-Ranges bytes
- Content-Length 2173
- Connection close
- Content-Type application/x-gzip
- Content-Encoding gzip
Ну и размер отданного файла стал вдвое меньше. Вывод - метод работает.
Нужно вручную все эти файлы упаковать и загрузить на сервер. Одно радует их количество не стремится к бесконечности... С другой стороны нет нагрузки на сервер для создания упакованной копии этого файла. А меняются эти файлы крайне редко...
Собственно решение прямо в лоб - упаковать файлы один раз и “задеплоить” на сервер. Я это(сжатие) делаю с помощью всё того же phing-а, а решение о том какой файл (сжатый или нет) отдать клиенту принимает mod_rewrite:
Принцип работы:
Если рядом с файлом javascript.js будет находиться его сжатая копия javascript.js.gz и в запросе будет явно указано, что клиент поддерживает gzip-encoding, то клиенту выдаётся сжатая копия. Если сжатие не поддерживается или сжатого файла нет в ответ вернётся оригинальный файл.
В результате трафик сервера и нагрузка на сервер снижается. То же самое можно сделать и для CSS.
Есть ли более изящные способы?
Комментарии
Можно использовать модуль http://drupal.org/project/javascript_aggregator
Он разбирает $scripts, собирает все возможные комбинации JS-файлов в один и сохраняет версию в кеше.
Про сжатие я не нашёл ничего в описании...
Таким образом он уменьшает только количество запросов к серверу для получения JS-файов...
см
http://drupal.ru/node/12463
> Есть ли более изящные способы?
Один вариант привёл Dimm, а другой - использовать nginx. Он может просто сжимать статику на лету, а может в точности делать то, что вы хотите: отдавать сжатые файлы вместо несжатых. (Эта возможность появилось недавно в 0.6.x ветке)
>Есть ли более изящные способы?
mod_deflate в стандартной поставке apache 2.x