Как настроить mod_deflate для обслуживания сжатых ресурсов, подготовленных с помощью assets:precompile

При выполнении задачи assets:precompile rake создаются сжатые gzip-версии ресурсов вашего приложения. Согласно руководству Rails для конвейера активов, вы можете настроить свой веб-сервер (в моем случае Apache 2.2) для обслуживания этих предварительно сжатых файлов вместо того, чтобы веб-сервер выполнял работу.

Что я не могу понять, так это как настроить mod_deflate так, чтобы эти файлы обслуживались вместо двойного сжатия, а затем обслуживались?

У меня включен mod_deflate через httpd.conf:

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

И я преобразовал код в руководстве по рельсам, чтобы перейти в .htaccess в public/assets:

# Some browsers still send conditional-GET requests if there's a
# Last-Modified header or an ETag header even if they haven't
# reached the expiry date sent in the Expires header.

Header unset Last-Modified
Header unset ETag
FileETag None

# RFC says only cache for 1 year

ExpiresActive On
ExpiresDefault "access plus 1 year"

# Serve gzipped versions instead of requiring Apache to do the work

RewriteEngine on
RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz [L]

# without it, Content-Type will be "application/x-gzip"

<FilesMatch .*\.css.gz>
    ForceType text/css
</FilesMatch>

<FilesMatch .*\.js.gz>
    ForceType text/javascript
</FilesMatch>

Любые идеи, как настроить это правильно?


person jrosw    schedule 22.09.2011    source источник


Ответы (1)


Во-первых, вы не хотите, чтобы mod_deflate работал здесь. Итак, в файле ресурсов .htaccess добавьте:

SetEnv no-gzip

Это должно отключить mod_deflate для ваших ресурсов.

Во-вторых, я не хочу не соглашаться с ребятами из rails, но я думаю, что в их рецепте .htaccess есть пара недостатков. Верхняя часть в порядке, но для RewriteEngine и выше у меня было бы:

RewriteEngine on
# Make sure the browser supports gzip encoding before we send it
RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b
RewriteCond %{REQUEST_URI} .*\.(css|js)
RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz [L]

# without it, Content-Type will be "application/x-gzip"
# also add a content-encoding header to tell the browser to decompress

<FilesMatch \.css\.gz$>
    ForceType text/css
    Header set Content-Encoding gzip
</FilesMatch>

<FilesMatch \.js\.gz$>
    ForceType application/javascript
    Header set Content-Encoding gzip
</FilesMatch>
person sbutler    schedule 22.09.2011
comment
Небольшой комментарий - если этого нет в .htaccess, он ДОЛЖЕН быть в разделе Directory, иначе -s не будет работать. - person lzap; 18.10.2013
comment
Кроме того, вы, вероятно, должны рекомендовать использование application/javascript вместо text/javascript. См. RFC4329 в разделе Сценарии типов мультимедиа. - person tne; 03.03.2014
comment
мне пришлось сделать ‹IfModule mod_mime.c› AddEncoding gzip .gz ‹/IfModule› в остальном хорошо - person Torsten; 31.03.2016
comment
Sprockets › 3.4 теперь компилирует ресурсы в виде файлов .gz. Наличие этого кода в вашем файле .htaccess при использовании sprockets › 3.4 не позволит браузеру читать скомпилированные css и js, поэтому использование этого решения не требуется. - person Hank Snow; 14.07.2016