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

8

Я хочу, чтобы Apache отправлял статические файлы по gzip'у по проводам, но также хочу, чтобы Apache не всегда gzip их снова и снова. Поэтому я подумал, что нельзя будет доставить файл .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. Кто-нибудь знает, как это может работать?

Boldewyn
источник
Я удивлен, что это не так очевидно, так как кажется, что безумно иметь веб-сервер, который этого не делает. Я думаю, что IIS имеет систему для кэширования сжатых копий статических файлов при первом доступе. mod_deflate не упоминает такую ​​функцию.
rjmunro
Документы apache mod_deflate теперь имеют собственный пример: httpd.apache.org/docs/2.4/mod/mod_deflate.html#precompressed
cweiske

Ответы:

5

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

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

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

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

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

НТН.

Сэм Халике
источник
Хорошо, спасибо! Есть документы для% {HTTP: ...} вещи? Я не видел упоминаний об этом в разделе RewriteCond Apache 2.2. FilesMatch была еще одной идеей, которая у меня была, но я подумала, что она более многословна Поскольку оба правила должны запускать механизм регулярных выражений, никакой разницы не должно быть.
Болдевин
ОК, нашел документы. httpd.apache.org/docs/2.2/mod/mod_rewrite.html Я только что пропустил интересную часть.
Болдевин
Это не большая проблема, но, читая этот конфиг, если кто-то вручную загрузит файл .css.gz, он получит текст / css, когда ему нужно будет получить тип application / x-gzip.
rjmunro
Почему ! перед gzip в строке Accept-Encoding? Конечно, это противоположность того, что вам нужно?
rjmunro
Я думал то же самое, что имеет смысл иметь RewriteCondтолько совпадают , когда клиент делает принимать GZIP кодирования.
Дэвид Z
3

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

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

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

Тем не менее, я хотел бы услышать решения и мнения других.

Boldewyn
источник