提问人:Jared Sprague 提问时间:7/21/2023 更新时间:7/21/2023 访问量:47
Apache:如何使用mod_deflate解压缩预压缩的 HTML?(INFLATE 未按文档记录工作)
Apache: How to decompress pre-compressed HTML using mod_deflate? (INFLATE not working as documented)
问:
我正在开发一个静态生成的 html 站点,该站点捆绑到容器映像中。为了减小容器映像的整体大小,我们预压缩了所有 HTML 文件,为了简化我们的 Apache 配置,我们删除了文件名的“.gz”部分,因此 index.html 实际上是预压缩的,然后我们在 text/html 的 Apache 配置中将内容编码设置为 gzip,以便浏览器将其视为压缩并在客户端浏览器中解压缩。这一切都非常有效,但是现在为了进一步减小图像大小,我们还希望使用 SSI 来包含页眉和页脚 html,而无需在每页上复制它,但由于我们的 HTML 文件已经预压缩,我们需要在 Apache 中设置一个输出过滤器链以首先解压缩 (INFLATE), 然后运行 SSI (INCLUDES),然后使用 DEFLATE 重新压缩。
从理论上讲,这应该有效:
<LocationMatch "/compressed/">
Options +Includes
SetOutputFilter INFLATE;INCLUDES;DEFLATE
</LocationMatch>
我遇到的问题是 INFLATE 没有像mod_deflate文档所说的那样解压缩预压缩文件。
鉴于我有一个名为的目录,并且在该目录中我有一个使用 gzip html 文件预压缩的目录(注意,.gz 扩展名已被删除)。此文件还包含几个用于页眉和页脚的 SSI 包含。/compressed/
index.html
我干的第一件事是这样的:
<LocationMatch "/compressed/">
Options +Includes
SetOutputFilter INFLATE;INCLUDES;DEFLATE
</LocationMatch>
但是,INFLATE 过滤器不起作用,因此 INCLUDES 过滤器不起作用。
我还尝试了这种方法,根据 INFLATE 的 Apache 过滤器示例,它看起来正是我需要的,也没有用:
<LocationMatch "/compressed/">
Options +Includes
# filter provider for decompressing
FilterDeclare gunzip CONTENT_SET
FilterProvider gunzip INFLATE "'1' == '1'"
# filter provider for SSI
FilterDeclare SSI
FilterProvider SSI INCLUDES "'1' == '1'"
FilterChain gunzip SSI
</LocationMatch>
这也没有用。请注意,我使 FilterProvider 的条件始终解析为 true,只是为了消除这个问题。"'1' == '1'"
问题在于,在这两种情况下,INFLATE 都不会解压缩预压缩的 HTML,即使示例和官方文档说这正是它应该做的!
作为一个棘手的解决方法,我创建了一个直接使用二进制文件的外部过滤器,它工作得很好:gunzip
ExtFilterDefine gunzip mode=output \
cmd="/usr/bin/gunzip"
<LocationMatch "/compressed/">
Options +Includes
SetOutputFilter gunzip;INCLUDES;DEFLATE
</LocationMatch>
上面的工作非常完美,它解压缩 HTML,运行 SSI includes,然后使用 DEFLATE 重新压缩它以发送响应。因此,从我读到的有关 INFLATE 的内容来看,它应该做与 完全相同的事情,那么为什么直接使用效果很好,但无论我尝试使用 INFLATE 做什么,它都不会解压缩?gunzip
gunzip
谁能帮我举一个使用 INFLATE 解压缩预压缩 HTML 的工作示例?
谢谢!
答: 暂无答案
评论