如果我在CLI中运行gzip,我可以获得良好的压缩率:
bundle.js: 75.3% -- replaced with bundle.js.gz
但是在Apache中,即使我设置了deflate,它也会压缩,但文件大小相同。下面是我的Apache配置:
LoadModule deflate_module libexec/apache2/mod_deflate.so
<IfModule deflate_module>
DeflateCompressionLevel 9
AddOutputFilterByType DEFLATE application/javascript text/plain text/css
CustomLog /var/log/deflate_log DEFLATE
</IfModule>
以下是回复:
ETag "8342b-53dc33d01d2c0-gzip"
Server Apache/2.4.23 (Unix)
Content-Type application/javascript
Last-Modified Sat, 01 Oct 2016 01:00:35 GMT
Date Sun, 02 Oct 2016 01:14:20 GMT
Connection Keep-Alive
Vary Accept-Encoding
Accept-Ranges bytes
Keep-Alive timeout=5, max=98
Content-Encoding gzip
Transfer-Encoding Identity
网络传输大小与之前相同,比率为1.00x。我把它缩小到只有js得到不压缩,而css得到的压缩比为6.22x。 js文件有问题吗?
答案 0 :(得分:0)
我明白了!
我注意到没有&#34;内容长度&#34;响应中的标头。所以我回去查看Apache文档。它说:
DeflateBufferSize指令指定的大小(以字节为单位) zlib应该一次压缩的碎片。如果压缩了 响应大小大于此指令指定的响应大小 httpd将切换到分块编码(HTTP标头Transfer-Encoding 设置为Chunked),副作用是不设置任何 Content-Length HTTP标头。这在httpd时特别重要 在反向缓存代理后面或在配置httpd时工作 mod_cache和mod_cache_disk因为没有任何HTTP响应 Content-Length标头可能未被缓存。
因为我的js文件是500k,远远超过默认的8k设置,所以我在conf文件中添加了以下内容,现在一切都很好:
<IfModule deflate_module>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript text/plain text/css
DeflateBufferSize 8096000
</IfModule>