主题:【讨论】apache 设定压缩传送和缓存控制的一些问题 -- 铁手
想达到两个目标。一、对非图片,非视频内容,在客户浏览器支持的情况下,进行压缩传输;二、尽可能的支持客户端浏览器的缓存功能。对于一般情况下没有变动的内容,比如图片,可以缓存较长时间。对于一些时不时有修改的,比如 .css 和 .js 文件,则希望每次页面访问都到服务器去看一下是不是有更新,如果没有则返回 HTTP/1.1 304 Not Modified,如果有更新,就下载新的并缓存。还有一些内容,禁止缓存。还要附带考虑一下代理缓存的问题。
想尽可能在 apache httpd 中实现,必要的时候,在程序中补充实现。
压缩相关的:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript
</IfModule>
因为大多数图片都是已经压缩过的,所以不必在传输时再来压缩一次。静态图片正常,查看 header 信息后,确认没有被再压缩。但是动态产生的图片,比如用 php readfile 时,header 中有 Content-Encoding: gzip 而 Content-Type: image/jpeg,这按理应该不会被压缩的啊。
要怎么做,动态产生的图片才不会再被压缩一次?
缓存相关的:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A864000
ExpiresByType text/html A300
</IfModule>
对于大部分的内容,设定足够长的缓存时间。
<IfModule mod_headers.c>
Header set Vary Accept-Encoding
<FilesMatch "\.(ico|gif|jpg|png|js|css)$">
Header append Cache-Control "public, must-revalidate"
</FilesMatch>
</IfModule>
特别是对于 .js 和 .css 文件,希望能够在每个页面访问时,都去检查一下服务器,看看是不是有内容改动。上面的设置似乎无效,改动的js没有被更新。补充,后来试验了一下用 no-cache,似乎就可以了,每次的都会去服务器询问是否有改变,而不是用了本地缓存就不管了。
这个 must-revalidate 和 no-cache 到底有什么区别啊?看说明,no-cache 需要到服务器确认后才能使用缓存。从字面意思,这个应该是 must-revalidate 的效果啊。难道说,must-revalidate是对客户端的缓存进行确认,比如缓存是不是到期了?而 no-cache 是对服务器端进行确认,比如缓存和内容源是不是对得上号?
上面的一些设置,大家觉得怎么优化比较好?为什么?
- 相关回复 上下关系6
🙂【讨论】apache 设定压缩传送和缓存控制的一些问题
🙂尝试解决 1 老翅 字851 2012-11-10 23:26:45
🙂多谢,根据你的提示,第一个问题解决了 铁手 字78 2012-11-16 02:21:13
🙂书本答案 1 中亠 字4420 2012-11-08 01:44:24
🙂现在看来,must-validate单独还不够 铁手 字49 2012-11-16 02:25:11
🙂不知道网站的需要是什么 中亠 字684 2012-11-16 20:40:33