Apache:如何使用mod_deflate解压缩预压缩的 HTML?(INFLATE 未按文档记录工作)

Apache: How to decompress pre-compressed HTML using mod_deflate? (INFLATE not working as documented)

提问人:Jared Sprague 提问时间:7/21/2023 更新时间:7/21/2023 访问量:47

问:

我正在开发一个静态生成的 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 做什么,它都不会解压缩gunzipgunzip

谁能帮我举一个使用 INFLATE 解压缩预压缩 HTML 的工作示例?

谢谢!

apache gzip httpd.conf ssi mod-deflate

评论


答: 暂无答案