Ручное сжатие контента в Apache
Мне нужно решение для сжатия вручную на Apache. Мои цели:
- Предоставить gzip-кодированный контент на моем сервере вместе с несжатым.
- Файлы предварительно сжаты.
- Не все файлы обслуживаются сжатыми. Я хочу указать эти файлы, и выбор не зависит от типа (расширения).
- Многие типы контента (пользовательские) обслуживаются, и время от времени появляются новые типы. Кроме того, расширение файла не определяет, будет ли оно сжато или нет (!!!).
- Держите накладные расходы минимальными (чем меньше лишних заголовков, тем лучше).
- Всегда предоставляйте заголовок Content-Length и никогда не отправляйте фрагментированный ответ (это дисквалифицирует
mod_deflate
).
Идеальная функциональность
Идеальная функциональность будет работать так:
- Веб-клиент запрашивает файл
file.ext
, - Если
file.ext.gz
существует на сервере:Content-Encoding
установлен вgzip
,Content-Type
установлен в значениеfile.ext
(!!!)- Сервер возвращается
file.ext.gz
,
- Иначе,
file.ext
возвращается
Я протестировал несколько решений, эта статья содержит хорошую компиляцию, но всегда была проблема с частями, отмеченными (!!!). У меня есть сотни тысяч файлов и десятки типов контента, и поэтому я ищу какое-то автоматическое решение, без необходимости добавления ForceType
для каждого файла.
Что я пробовал
MultiViews
Как это работает:
- Переименовать файл
file.ext
вfile.ext.en
- Создать файл
file.ext.gz
Настройте Apache:
Опции +MultiViews AddEncoding x-gzip .gz RemoveType .gz
Работает почти так, как ожидалось, за исключением того, что требуется оригинальный файл (file.ext
) не существует, и это добавляет много (бесполезно для меня) заголовков (TCN
, Content-Language
и еще несколько), которые не могут быть удалены (Header unset
не удаляет их).
перезапись
Как это работает:
- Создать file.ext.gz
файл.
- Настройте Apache:
<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
, но я не нашел способ, как это сделать.