我需要 Apache 上的手动压缩解决方案。我的目标:
- 在我的服务器上提供 gzip 编码的内容以及未压缩的内容。
- 文件是预压缩的。
- 并非所有文件都经过压缩处理。我想指定这些文件,并且选择不是基于类型(扩展名)的。
- 提供了许多内容类型(自定义类型),并且不时出现新类型。此外,文件扩展名不能确定它是否会被压缩(!!!)。
- 保持开销最小(额外的标头越少越好)。
- 始终提供 Content-Length 标头并且从不发送分块响应(这会取消资格
mod_deflate
)。
理想的功能
理想的功能应该是这样的:
- Web 客户端请求文件
file.ext
。 - 如果
file.ext.gz
服务器上存在:Content-Encoding
设置为gzip
。Content-Type
设置为file.ext
( !!! ) 的值。- 服务器返回
file.ext.gz
。
- 否则,
file.ext
返回。
我测试了很多解决方案,这篇文章包含了一个很好的编译,但是标有(!!!)的部分总是有问题。我有数十万个文件和数十种内容类型,因此我正在寻找一些自动解决方案,而无需ForceType
为每个文件添加。
我试过的
多视图
这是如何工作的:
- 将文件重命名
file.ext
为file.ext.en
- 创建文件
file.ext.gz
配置阿帕奇:
选项 + 多视图 AddEncoding x-gzip .gz 删除类型 .gz
几乎可以按预期工作,只是它要求原始文件 ( file.ext
) 不存在,并且它添加了许多(对我来说无用)无法删除的标题(TCN
以及Content-Language
更多)(Header unset
不会删除它们)。
改写
这是如何工作的: - 创建file.ext.gz
文件。- 配置阿帕奇:
<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