Назад | Перейти на главную страницу

Apache: отправка предварительно упакованных файлов в формате gzip.

Я хочу, чтобы Apache отправлял статические файлы, сжатые с помощью gzip, по сети, но также хочу, чтобы Apache не всегда сжимал их снова и снова. Поэтому я подумал, нельзя ли доставить файл .gz, если он существует. Эта установка:

Файловая структура:

static/
|
|--- style.css
|
\--- style.css.gz

И следующее в .htaccess:

Правило mod_rewrite:

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

И эта настройка:

AddEncoding x-gzip .gz

Собственно, это работает постольку, поскольку файл .gz отправляется вместо .css, если запрос идет на /static/style.css. Проблема только в том, что файл поставляется как «application / x-gzip», а не как «text / css». Использование флага T mod_rewrite не меняет этого. Нет и явного

AddType text/css .css

Есть ли у кого-нибудь идея, как я могу добиться желаемого поведения? Или я почему-то не считал это необходимым?

РЕДАКТИРОВАТЬ: Есть дополнительная трудность: отправка исходного файла клиентам без поддержки gzip. Кто-нибудь знает, как это может работать?

Решение для отправки правильной версии в браузеры, которые не принимают gzip, могло бы быть примерно таким:

RewriteCond %{HTTP:Accept-Encoding} !gzip
...your rules here...

Также есть другой способ изменить тип, а именно:

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

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

HTH.

Ах, похоже, я нашел решение: флаг T не работает, если установлен по тому же правилу, но он обязательно работает, если вы используете его собственное правило:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz

RewriteRule \.css\.gz$ - [T=text/css]
RewriteRule \.js\.gz$ - [T=text/javascript]

И все же хотелось бы услышать чужие решения и мнения.