Как заставить Apache использовать предварительно сжатые gz-файлы CSS и JS-файлов вручную? - PullRequest
28 голосов
/ 31 января 2012

У меня простой вопрос. У меня есть веб-каталог /css и внутри находится файл style.css. Я вручную распаковал этот файл и сохранил его как style.css.gz. Я хочу сохранить циклы процессора, чтобы не сжимать файл CSS при каждом запросе. Как настроить Apache для поиска этого .gz файла и его обслуживания вместо сжатия файла .css снова и снова?

Примечание: я не хочу, чтобы Apache сам создавал файл .gz. В моем сценарии я должен создать .css.gz файл вручную - используя PHP для определенных запросов.

Ответы [ 5 ]

50 голосов
/ 06 февраля 2012

Некоторый RewriteRule должен справиться с этим достаточно хорошо.

В файле конфигурации Drupal я нашел:

# AddEncoding allows you to have certain browsers uncompress information on the fly.
AddEncoding gzip .gz

#Serve gzip compressed CSS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.css $1\.css\.gz [QSA]

# Serve gzip compressed JS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.js $1\.js\.gz [QSA]

# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]

Это сделает работу.Вы можете поместить это либо в раздел <Directory foo/>, либо в файл .htaccess, если у вас нет доступа к конфигурации Apache или если вы хотите замедлить работу вашего веб-сервера.

9 голосов
/ 22 мая 2014

Продолжая ответ regilero, вы также должны добавить еще несколько строк, чтобы убедиться, что сервер отвечает соответствующим заголовком Content-Encoding:

#Serve gzip compressed CSS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.css $1\.css\.gz [QSA]

# Serve gzip compressed JS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.js $1\.js\.gz [QSA]

# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1,E=is_gzip:1]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=is_gzip:1]
Header set Content-Encoding "gzip" env=is_gzip
7 голосов
/ 21 января 2016

Вместо того, чтобы реализовывать согласование контента самостоятельно, используя mod_rewrite (и упустить такие расширенные функции, как q-values ​​, status 406 , TCN и т. Д.) Вы можете использовать mod_negotiation, как описано в в этом вопросе . Копируем мой ответ оттуда:

Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz
<FilesMatch ".+\.tar\.gz$">
    RemoveEncoding .gz
    # Note:  Can use application/x-gzip for backwards-compatibility
    AddType application/gzip .gz
</FilesMatch>

Это дает дополнительный бонус: он работает для всех файлов .gz, а не только для .css.gz и .js.gz и легко расширяется для дополнительных кодировок.

У него есть один существенный недостаток, поскольку согласовываются только запросы на несуществующие файлы файл с именем foo.js будет делать запросы на /foo.js (но не /foo) вернуть несжатую версию. Этого можно избежать, используя решение Франсуа Мариера для переименования несжатых файлов с двойным расширением, поэтому foo.js развертывается как foo.js.js. Если это ограничение не слишком болезненно для вашего процесса развертывания, стоит подумать о mod_negotiation.

6 голосов
/ 09 февраля 2012

Я понимаю, что это не то, что вы спросили, но я все равно выкидываю это.Рассматривали ли вы просто использование mod_cache с mod_gzip?При правильной конфигурации apache будет распаковывать файлы для вас, а затем передавать сжатые файлы кэша клиентам и последующим прокси.Это намного эффективнее, чем то, что вы предлагаете с точки зрения времени и усилий, и одинаково эффективно с точки зрения пропускной способности и вычислительной нагрузки.

Неважно, что PHP сначала сжимал файлы, потому что с правильными настройками mod_gzipобнаружит это.Суть в том, что вы можете кэшировать сжатые файлы, и Apache не будет их повторно сжимать.

1 голос
/ 07 февраля 2012

Не является ли этот пост именно тем шагом, который вы искали?

Мы проверяем, что эта gzip-версия файла существует (четвертая строка), и если это так, мы добавляем .gz к запрашиваемому имени файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...