我目前在vhost中使用此设置:
<Location />
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
</Location>
<Directory />
ExpiresActive On
ExpiresByType text/html "access plus 5 minutes"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresDefault "access plus 1 day"
<FilesMatch "\.(ico|jpeg|pdf|flv|jpg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=2592000, public"
Header unset Last-Modified
Header unset ETag
FileETag None
</FilesMatch>
<FilesMatch "\.(html|php)$">
Header set Cache-Control "max-age=900, public, must-revalidate"
</FilesMatch>
</Directory>
虽然它可以很好地加速这件事,但有时候用户看不到他们自己在内容上做出的改变(主要是在使用FireFox时):(任何建议/优化提示?
答案 0 :(得分:1)
您应该发送一个必须重新生成的标头,并通过发送Expires和Last-Modified标头来控制编程语言(例如PHP)中的缓存,而不是强制浏览器缓存。然后,浏览器会向您的网站询问每个请求的最新版本,但如果没有任何更改,请务必使用空白页面进行回答。
这可能需要一些时间来实施,但它确实有效。
答案 1 :(得分:0)
这里的问题是浏览器缓存你的javascript,css和图像,因此不知道你是否修改了服务器中的任何内容,除非缓存过期。
例如,假设您有一个名为script.js的JS文件。根据htaccess文件中的以下规则,
ExpiresByType application/x-javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
javascript文件缓存一个月,因此除非手动清除缓存,否则将不会要求新文件请求1个月的JS文件。
如何解决此问题。
假设您的文件名是script.js,在HTML文件中,您应该包括is
<script src="includes/script.100.js" type="text/javascript"></script>
或
<link rel="stylesheet" type="text/css" href="includes/style.100.css" />
100可以是任何数字。我通常会增加1,2,3 ......等等(版本号是准确的)。
现在,在我的htaccess中,我有类似
的东西RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^includes/style\.[\d]+\.css$ /includes/style.css [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^includes/script\.[\d]+\.js$ /includes/script.js [L]
以上两个条件确保使用实际文件,无论文件名和文件类型之间使用的是什么数字。
这可以确保每次进行更改时,一旦更改了版本号,所有旧缓存都会过期,所有用户都会看到最新的代码。
答案 2 :(得分:0)
在Hannes的回复后发布此评论,问题是基于内容,而不是基于js / css文件..
我有过一次这个问题,但无法确定是什么问题。我认为原因可能是HTML页面缓存在我和浏览器之间的代理服务器中。
所以,我所做的是使用名为hash的查询参数生成的url,其中包含md5(time(“U”));
例如,具有相同问题的网址类似于
http://test.com/controller/functionname/
在此问题之后,我进行了更改,以便用户点击的所有网址都是
http://test.com/controller/functionname/?hash= {东西}。
我希望能帮到你。另外要确保您可以添加您的网页。
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">