【问题标题】:How to disable gzip compression in htaccess for a folder如何在 htaccess 中为文件夹禁用 gzip 压缩
【发布时间】:2021-06-23 15:05:59
【问题描述】:

我希望禁用文件夹 xxx 的 gzip 文件夹。查看 StackOverflow,我已经尝试过:

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 模块之外,但没有任何作用。

有人可以帮忙吗?

【问题讨论】:

    标签: apache .htaccess gzip mod-deflate mod-filter


    【解决方案1】:
    SetEnvIf Request_URI ^/flipbook(.*) no-gzip dont-vary
    

    这看起来应该可以工作 - 对于任何以 /flipbook 开头的 URL(区分大小写)。设置 no-gzip 环境变量会禁用 mod_deflate 的 DEFLATE 过滤器。

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

    所以,应该这样写:

    SetEnvIf Request_URI "^/flipbook" no-gzip
    

    参考:


    # enables the filter
    SetOutputFilter DEFLATE
    

    这不仅仅是“启用过滤器”,它还对所有响应启用了 DEFLATE 过滤器。这基本上呈现了多余的 AddOutputFilterByType 指令,因为您已经在所有内容上设置了 DEFLATE。一般来说,你不想在所有东西上设置它,这大概就是你使用AddOutputFilterByType指令的原因。

    因此,如果您在特定的 mime 类型上设置 DEFLATE,您可能不需要 SetOutputFilter 指令。或者,您使用 SetOutputFilter 并删除 AddOutputFilterByType 指令,但您仍应使用 no-gzip 环境变量禁用图像和其他已压缩媒体上的过滤器。

    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 &lt;If&gt; 表达式仅在访问以 /flipbook 开头的 URL 时有条件地设置输出过滤器。

    例如:

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

    除非您打算将相同的代码移植到可能未启用 mod_deflate 的多个服务器(这是可以接受的),否则您实际上并不需要 &lt;IfModule&gt; 包装器。

    【讨论】:

    • 替代解决方案是 Apache 2.4+ 的最佳解决方案
    • 非常感谢..我测试了替代解决方案,它运行良好。你真的帮了我很大的忙。我承认我在 php 方面还不错,但我对 Apache 真的很烂 :)
    • @dock21 不客气。如果这回答了您的问题,那么请通过单击投票箭头下方左侧答案旁边的勾号/复选标记将其标记为“已接受”(以帮助其他用户并从未回答的问题队列中删除该问题)。您还可以为您认为有帮助的答案投票。谢谢,非常感谢。 :)
    猜你喜欢
    • 2014-07-07
    • 2012-03-04
    • 1970-01-01
    • 2021-12-06
    • 2016-06-25
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多