Подтвердить что ты не робот

Как заставить Apache вручную использовать предварительно сжатый gz файл файлов CSS и JS?

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

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

4b9b3361

Ответ 1

Некоторый 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 или если вы хотите замедлить работу своего веб-сервера.

Ответ 2

Продолжая отвечать на 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

Ответ 3

Вместо того, чтобы самостоятельно реализовывать согласование контента с помощью 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.

Ответ 4

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

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

Ответ 5

Не этот пост в блоге точно пошагово, что вы искали?

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

Ответ 6

Я немного боролся с предложенным решением. Для всех, кто использует VirtualHosts с разными DocumentRoots, вам просто нужно изменить RewriteCond на:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}\.gz -s