С 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