Мне нужно решение для ручного сжатия на Apache. Мои цели:
- Размещать на моем сервере контент в кодировке gzip вместе с несжатым.
- Файлы предварительно сжаты.
- Не все файлы подаются сжатыми. Я хочу указать эти файлы, и выбор не зависит от типа (расширения).
- Подается много типов контента (настраиваемых), и время от времени появляются новые типы. Кроме того, расширение файла не определяет, будет он сжат или нет (!!!).
- Держите накладные расходы минимальными (чем меньше лишних заголовков, тем лучше).
- Всегда предоставляйте заголовок Content-Length и никогда не отправляйте фрагментированный ответ (это дисквалифицирует
mod_deflate
).
Идеальная функциональность
Идеальная функциональность будет работать так:
- Веб-клиент запрашивает файл
file.ext
. - If
file.ext.gz
exists on server:Content-Encoding
is set togzip
.Content-Type
установлено значениеfile.ext
(!!!).- Сервер возвращает
file.ext.gz
.
- В противном случае возвращается
file.ext
.
Я протестировал ряд решений, эта статья содержит хорошую компиляцию, но всегда были проблемы с частями, помеченными (!!!). У меня есть сотни тысяч файлов и десятки типов контента, и поэтому я ищу какое-то автоматическое решение, без необходимости добавления ForceType
для каждого файла.
Что я пробовал
Мультивиды
Как это работает:
- Переименуйте файл
file.ext
вfile.ext.en
- Создайте файл
file.ext.gz
Настройте Апач:
Options +MultiViews AddEncoding x-gzip .gz RemoveType .gz
Работает почти так, как ожидалось, за исключением того, что требуется, чтобы исходный файл (file.ext
) не существовал, и добавляется много (бесполезных для меня) заголовков (TCN
, Content-Language
и еще несколько), которые нельзя удалить (Header unset
их не удаляет).
Переписать
Как это работает: - Создайте файл file.ext.gz
. - Настроить Апач:
<pre>
RewriteEngine On
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*)$ $1.gz [L]
AddEncoding x-gzip .gz
<Files file.ext>
ForceType my-custom/mime-type
</FilesMatch>
</pre>
Это работает хорошо, но требует ForceType
для каждого сжатого файла. Как я уже говорил, я не могу полагаться на расширения, потому что не все файлы определенного типа будут сжаты.
mod_deflate
Я особо не исследовал, проблема в том, что если файл слишком большой, то он разбивается на части и отправляется кусками, а Content-Length
не предоставляется. Увеличение размера буферов сжатия не может устранить эту проблему.
Можно ли вообще настроить Apache так, чтобы он работал так, как мне хотелось бы?
Я попытался динамически получить Content-Type
из file.ext
и установить его в file.ext.gz
, но не нашел, как это сделать.