Ручное сжатие контента в 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, но я не нашел способ, как это сделать.

0 ответов

Другие вопросы по тегам