我正在实施浏览器缓存,并遵循Google PageSpeed关于将Last-Modified设置为“过去足够远”的数据的建议。我的.htaccess中有以下内容:
<IfModule mod_headers.c>
<FilesMatch "\.(json|pdf|swf|bmp|gif|jpeg|jpg|png|svg|tiff|ico|flv|js)$">
Header Set Last-Modified "Fri, 01 Jan 2010 12:00:00 GMT"
</FilesMatch>
</IfModule>
我的服务器上安装了mod_headers。
不幸的是,Google PageSpeed仍抱怨并警告我:
Leverage browser caching
The following cacheable resources have a short freshness lifetime. Specify an expiration at least one week in the future for the following resources:
然后列出PNG,GIF,JPG等.Yahoo YSlow说的基本相同。
查看我应该缓存的一个资源的响应头,我看到了:
Date: Tue, 19 Oct 2010 20:12:04 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Tue, 07 Sep 2010 23:51:33 GMT
Etag: "2e0e34-2a43-48fb413a96a20"
Accept-Ranges: bytes
Content-Length: 10819
Content-Type: image/png
如您所见,Last-Modified数据与我在.htaccess中指定的数据不匹配。
任何想法我做错了什么?
答案 0 :(得分:7)
删除Last-Modified
并不是Google PageSpeed所要求的。当浏览器要求提供静态文件时,它希望在服务器响应中看到以下标题:
Cache-Control max-age=...
Expires ...
代替点,服务器将放置值。
为了做到这一点,您只需要在.htaccess
添加以下行:
<IfModule mod_headers.c>
<FilesMatch "\.(json|pdf|swf|bmp|gif|jpeg|jpg|png|svg|tiff|ico|flv|js)$">
ExpiresActive On
ExpiresDefault "access plus 1 year"
Header append Cache-Control "public"
</FilesMatch>
</IfModule>
你会看到谷歌PageSpeed停下来抱怨。
答案 1 :(得分:2)
您是否考虑过使用未设置的Last-Modified?
示例:
<IfModule mod_headers.c>
<FilesMatch "\.(json|pdf|swf|bmp|gif|jpeg|jpg|png|svg|tiff|ico|flv|js)$">
Header unset Last-Modified
</FilesMatch>
</IfModule>
FilesMatch部分看起来很好,所以它可能只是Header Set的一些小问题。地狱,甚至可能是区分大小写的。请尝试使用Header set
代替Header Set
如果这不是您想要的,请告诉我,我会再考虑一下。但是,Unset应该可以正常工作,
答案 2 :(得分:0)
这有效:
<IfModule mod_expires.c>
# Enable expirations
ExpiresActive On
# Default directive
ExpiresDefault "access plus 1 month"
# My favicon
ExpiresByType image/x-icon "access plus 1 year"
# Images
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"
# CSS
ExpiresByType text/css "access 1 month"
# Javascript
ExpiresByType application/javascript "access plus 1 year"
</IfModule>