Apache中的手动内容压缩

时间:2013-03-20 13:27:07

标签: apache mod-rewrite gzip mod-deflate

我需要在Apache上使用手动压缩解决方案。我的目标:

  • 在我的服务器上提供gzip编码的内容以及未压缩的内容。
  • 文件已预先压缩。
  • 并非所有文件都是压缩的。我想指定这些文件,而选择不是基于类型(扩展名)。
  • 提供了许多内容类型(自定义类型),并且不时会出现新类型。此外,文件扩展名不会确定它是否会被压缩( !!! )。
  • 保持开销最小化(额外标题越少越好)。
  • 始终提供Content-Length标头,并且永远不会发送分块响应(这会取消mod_deflate的资格。)

理想功能

理想的功能就是这样:

  • Web客户端请求文件file.ext
  • 如果服务器上存在file.ext.gz
    • Content-Encoding设置为gzip
    • Content-Type设置为file.ext !!! )的值。
    • 服务器返回file.ext.gz
  • 否则,将返回file.ext

我测试了许多解决方案,this article包含一个很好的编译,但标有( !!! )的部分始终存在问题。我有成千上万的文件和几十种内容类型,因此我正在寻找一些自动解决方案,而不需要为每个文件添加ForceType


我尝试了什么

在Multiviews

这是如何运作的:

  • 将文件file.ext重命名为file.ext.en
  • 创建文件file.ext.gz
  • 配置Apache:

    Options +MultiViews
    AddEncoding x-gzip .gz
    RemoveType .gz
    

几乎按预期工作,但它要求原始文件(file.ext)不存在,并且它会添加许多(对我来说无用)标题(TCNContent-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的{​​{1}}并将其设置为file.ext,但我找不到如何执行此操作的方法。

0 个答案:

没有答案