Назад | Перейти на главную страницу

Использование AddEncoding x-gzip .gz без фактических файлов

С Apache (2.2 и новее) как я могу добиться следующего. Я хочу прозрачно сжать с использованием кодировки GZip (не plain Deflate) вывод при запросе определенного файла с его именем и расширением .gz, где .gz версия физически не существует на диске.

Допустим, у меня есть файл с именем /path/foo.bar и нет файл foo.bar.gz в папке, к которой относится URI /path карты, как я могу заставить Apache обслуживать содержимое /path/foo.bar но с AddEncoding x-gzip ... применяется к (несуществующему) файлу?

Часть перезаписи кажется простой, но проблема в том, как применить кодировку к несуществующему элементу. Другой способ также кажется простым, если клиент поддерживает кодировку.

Единственное решение - действительно скрипт, который делает это на лету?


Я в курсе mod_deflate и mod_gzip и это не то, что я ищу - по крайней мере, не в одиночку. В частности, мне нужен реальный файл GZIP, а не просто спущенный поток.

Теперь я думал об использовании mod_ext_filter, но не смог преодолеть разрыв между переписыванием имени (несуществующего) file.gz к file с одной стороны и LocationMatch с другой. Вот что у меня есть.

RewriteRule ^(.*?\.ext)\.gz$ $1 [L]
ExtFilterDefine gzip mode=output cmd="/bin/gzip"
<LocationMatch "/my-files/special-path/.*?\.ext\.gz">
    AddType application/octet-stream .ext.gz
    SetOutputFilter gzip
    Header set Content-Encoding gzip
</LocationMatch>

Обратите внимание, что заголовок для Content-Encoding в этом случае клиентам не нужен. Они ожидают увидеть настоящие файлы GZIP, но я хочу делать это на лету без кеширования (это тестовый сценарий).

Хорошо, извините за свой ответ так скоро после предложения награды, но я наконец-то узнал, как выполнить то, что хочу. Мое последнее изменение моего вопроса было близко, но недостаточно.

Оказалось, я мог злоупотребить тем, что mod_rewrite позволяет мне установить MIME-тип перезаписанного пути (T=), чтобы применить мой фильтр (используя mod_ext_filter) используя AddOutputFilterByType директива вроде этой:

RewriteRule ^(.*?\.ext)\.gz$ $1 [L,T=application/my-file-type]
ExtFilterDefine gzip mode=output cmd="/bin/gzip"
<Location "/my-files">
    AddOutputFilterByType gzip application/my-file-type
</Location>

Таким образом, фактический файл (например, somename.ext.gz) не существует, но somename.ext делает существуют и mod_rewrite заботится об условном применении фильтра только тогда, когда запрос приходит с .ext.gz extension, но никогда, если запрос поступает под (существующим) именем.

Все, что я сделал, это изобрел свой собственный MIME-тип.


Как предложил 200_success в его / ее комментарии, я снова скорректировал его, чтобы он был более читабельным и полагался на переменную среды (условно установленную через mod_rewrite):

RewriteRule ^(.*?\.ext)\.gz$ $1 [L,E=NEEDGZIP:1]
ExtFilterDefine gzip mode=output cmd="/bin/gzip" enableenv=NEEDGZIP
<Location "/my-files">
    SetOutputFilter gzip
</Location>

mod_gzip должен помочь вам

http://sourceforge.net/projects/mod-gzip/

Вот несколько примеров конфигов http://schroepl.net/projekte/mod_gzip/config.htm