我想优化网络中使用的静态资产(.js,.css,...文件)的缓存。我的目标是基于这篇文章(https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#invalidating-and-updating-cached-responses)。
简而言之 - 因为这些静态资产往往是临时更新的(有时是每周一次,有时是一天两次......)我想在将来到期时缓存它们,并根据它们给出它们的唯一名称内容或修改日期或类似内容。这应该允许将它们缓存很长一段时间,但一旦发生某些变化就会更新它们。
Apache2服务器是否支持此技术?或者是否有一些中间件系统处理指纹生成(具有唯一的资产名称)并在HTML文件中更新对它们的引用(根本不会被缓存)?
我们在主机上使用LAMP堆栈。
提前谢谢
答案 0 :(得分:2)
有许多技术,有些比其他技术更好。一个好的是具有以下配置:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.(\d+)\.(bmp|css|cur|gif|ico|jpe?g|js|png|svgz?|webp|webmanifest)$ $1.$3 [L]
</IfModule>
这允许格式为/i/filename.1433499948.gif
的网址 - 但实际从磁盘读取的文件只是/i/filename.gif
文件名的第1和第3部分。
此Apache vhost / .htaccess节来自H5BP filename-based_cache_busting.conf文件,存储库中还有其他良好做法示例。
与H5BP mod_expires配置相结合,意味着您只需通过新名称更新对文件的引用,就可以轻松续订用户本地浏览器缓存。
答案 1 :(得分:1)
您可以为Apache启用mod_mime
,mod_expires
并使用以下代码段
<FilesMatch "\.(png|jp?g|gif|ico|mp4|wmv|mov|mpeg|css|map|woff?|eot|svg|ttf|js|json|pdf|csv)">
ExpiresActive on
ExpiresDefault "access plus 2 weeks"
</FilesMatch>
或设置相应的php
标题
session_cache_limiter('none');
header('Cache-control: max-age='.(60*60*24*7)); //one week
header('Expires: '.gmdate(DATE_RFC1123,time()+60*60*24*365)); //one week