西西河

主题:【讨论】apache 设定压缩传送和缓存控制的一些问题 -- 铁手

共:💬6 🌺10
全看分页树展 · 主题
家园 【讨论】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 是对服务器端进行确认,比如缓存和内容源是不是对得上号?

上面的一些设置,大家觉得怎么优化比较好?为什么?

全看分页树展 · 主题


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河