Как настроить mod_deflate для обслуживания сжатых ресурсов, подготовленных с помощью ресурсов: прекомпиляция - PullRequest
11 голосов
/ 22 сентября 2011

При работе с ресурсами: прекомпиляция rake-задачи создаются сжатые версии ресурсов вашего приложения. Согласно руководству по 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>

Есть идеи, как правильно это настроить?

1 Ответ

24 голосов
/ 22 сентября 2011

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

SetEnv no-gzip

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

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