如何在 htaccess 中为文件夹禁用 gzip 压缩

How to disable gzip compression in htaccess for a folder

我想禁用文件夹 xxx 的 gzip 文件夹。查看 Whosebug,我试过这个:

SetEnvIf Request_URI ^/xxx(.*) no-gzip dont-vary

但是不行。

我在这里添加了:

<IfModule mod_deflate.c>
    SetEnvIf Request_URI ^/flipbook(.*) no-gzip dont-vary
    # enables the filter
    SetOutputFilter DEFLATE

    # non-textual entities should be already compressed
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
    
</IfModule>

甚至在 mod_deflate 模块之外,但没有任何效果。

有人能帮忙吗?

SetEnvIf Request_URI ^/flipbook(.*) no-gzip dont-vary

这看起来应该有效 - 对于任何以 /flipbook (case-sensitive) 开头的 URL。设置 no-gzip 环境变量会禁用 mod_deflate.

的 DEFLATE 过滤器

但是,正则表达式中的 (.*) 部分完全是多余的。而且,除非您在自己的指令中专门使用 dont-vary env var,否则这不会执行任何操作。我不认为 dont-vary 是一个“特殊的”Apache env var。 Apache 有 force-no-vary,它可以做 dont-vary 可能打算做的事情,但是,我不认为你应该禁用 Vary header,因为 mod_deflate 根据从客户端发送的 Accept-Encoding HTTP 请求 header 应用过滤器,因此任何中间缓存代理 应该 基于此 header 缓存。 (只有某些代理有此问题 header。)

所以,应该这样写:

SetEnvIf Request_URI "^/flipbook" no-gzip

参考:


# enables the filter
SetOutputFilter DEFLATE

这不仅仅是“启用过滤器”,它还对 所有 响应启用 DEFLATE 过滤器。这基本上使后面的 AddOutputFilterByType 指令变得多余,因为您已经在所有内容上设置了 DEFLATE。通常,您不想在 everything 上设置它,这可能是您使用 AddOutputFilterByType 指令的原因。

因此,如果您在特定 mime-types 上设置 DEFLATE,您可能不需要 SetOutputFilter 指令。或者,您使用 SetOutputFilter 并删除 AddOutputFilterByType 指令,但您仍应使用 no-gzip env var.

禁用图像和其他已压缩媒体的过滤器
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

您不需要全部 3 个。您的服务器在发送 JavaScript 文件时只设置了一个 mime-type - 您可以在 HTTP 响应中看到。你只需要那个。 (大概application/javascript。)


备选方案

不是将 no-gzip env var 设置为禁用 mod_default,而是使用 Apache <If> 表达式仅在 不是时有条件地设置输出过滤器 访问 URL 开始于 /flipbook.

例如:

<If "%{REQUEST_URI} !~ m#^/flipbook/#">
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE application/javascript
</If>

你并不真的需要 <IfModule> 包装器,除非你打算将相同的代码移植到可能未启用 mod_deflate 的多个服务器(这是可以接受的)。