问题描述
我希望禁用文件夹 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 模块之外,但没有任何效果。
有人可以帮忙吗?
解决方法
SetEnvIf Request_URI ^/flipbook(.*) no-gzip dont-vary
这看起来应该可以工作 - 对于任何以 /flipbook
开头(区分大小写)的 URL。设置 no-gzip
环境变量会禁用 mod_deflate 的 DEFLATE 过滤器。
然而,正则表达式中的 (.*)
部分完全是多余的。而且,除非您在自己的指令中专门使用 dont-vary
env var,否则这不会做任何事情。我不认为 dont-vary
是一个“特殊”的 Apache 环境变量。 Apache 有 force-no-vary
,它执行 dont-vary
可能打算做的事情,但是,我认为您无论如何都不应该禁用 Vary
标头,因为 mod_deflate 基于 { {1}} 从客户端发送的 HTTP 请求标头,因此任何中间缓存代理应该基于此标头进行缓存。 (只有某些代理对此标头有问题。)
所以,应该这样写:
Accept-Encoding
参考:
SetEnvIf Request_URI "^/flipbook" no-gzip
这不仅是“启用过滤器”,它还对所有响应启用了 DEFLATE 过滤器。这基本上呈现了多余的 # enables the filter
SetOutputFilter DEFLATE
指令,因为您已经在所有内容上设置了 DEFLATE。通常,您不想在 everything 上设置它,这大概就是您使用 AddOutputFilterByType
指令的原因。
因此,如果您在特定 mime 类型上设置 DEFLATE,您可能不需要 AddOutputFilterByType
指令。或者,您使用 SetOutputFilter
并删除 SetOutputFilter
指令,但是您仍然应该使用 AddOutputFilterByType
环境变量禁用对图像和其他已压缩媒体的过滤器。
no-gzip
您不需要全部 3 个。您的服务器在发送 JavaScript 文件时只设置一种 MIME 类型 - 您可以在 HTTP 响应中看到。你只需要那个。 (可能是 AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
。)
替代解决方案
不是将 application/javascript
env var 设置为禁用 mod_default,而是使用 Apache no-gzip
表达式来有条件地设置输出过滤器,仅当不访问开始的 URL 时<If>
。
例如:
/flipbook
除非您打算将相同的代码移植到可能未启用 mod_deflate 的多个服务器(这是可以接受的),否则您实际上并不需要 <If "%{REQUEST_URI} !~ m#^/flipbook/#">
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/javascript
</If>
包装器。