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

How to disable gzip compression in htaccess for a folder

提问人:dock21 提问时间:3/27/2021 最后编辑:MrWhitedock21 更新时间:3/29/2021 访问量:1609

问:

我正在寻找禁用文件夹 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

评论


答:

3赞 MrWhite 3/27/2021 #1
SetEnvIf Request_URI ^/flipbook(.*) no-gzip dont-vary

这看起来应该有效 - 对于任何开头的 URL(区分大小写)。设置环境变量将禁用 mod_deflate 的 DEFLATE 过滤器。/flipbookno-gzip

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

所以,这应该写成:

SetEnvIf Request_URI "^/flipbook" no-gzip

参考:


# enables the filter
SetOutputFilter DEFLATE

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

因此,如果您在特定的 mime 类型上设置 DEFLATE,您可能不需要该指令。或者,您使用并删除这些指令,但您仍应使用 env var 在图像和其他已压缩的媒体上禁用过滤器。SetOutputFilterSetOutputFilterAddOutputFilterByTypeno-gzip

AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

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


替代解决方案

与其将 env var 设置为禁用 mod_default,不如使用 Apache 表达式仅在访问以 开头的 URL 时有条件地设置输出过滤器。no-gzip<If>/flipbook

例如:

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

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

评论

1赞 anubhava 3/27/2021
替代解决方案是 Apache 2.4+ 中的最佳解决方案
0赞 dock21 3/29/2021
非常感谢。.我测试了替代解决方案,它运行良好。你真的帮了我很多。我承认我在php方面还不错,但我对Apache :)真的很糟糕
0赞 MrWhite 3/31/2021
@dock21 不客气。如果这回答了您的问题,那么请点击投票箭头下方左侧答案旁边的勾号/复选标记将其标记为“已接受”(以帮助其他用户并将问题从未回答的问题队列中删除)。您还可以对您认为有用的答案投赞成票。谢谢,非常感谢。:)