Я хочу, чтобы 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]
И все же хотелось бы услышать чужие решения и мнения.