如何使用Apache设置静态资源缓存?

4
我希望优化我们网站中使用的静态资源(.js,.css等文件)的缓存。我的目标基于这篇文章(https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#invalidating-and-updating-cached-responses)。
简而言之 - 因为这些静态资源往往是临时更新的(有时每周一次,有时每天两次...),我想将它们缓存到远期过期,并根据内容或修改日期等给它们命名唯一名称。这应该允许长时间缓存它们,但在发生更改时立即更新它们。
Apache2服务器是否支持此技术?还是有一些中间件系统处理指纹生成(以获得唯一的资产名称)并在HTML文件中更新对它们的引用(这根本不会被缓存)?
我们在主机上使用LAMP堆栈。
提前感谢您。

@AlisterBulman和`@sitilge,非常感谢你们,我会阅读你们推荐的所有文章。还从另一个人那里得到了建议,使用Apache的PageSpeed模块。你知道这是否是一个好的解决方案吗? - krajicek
关于PageSpeed模块 - 如果您自己进行了代码缩小、缓存和优化,那么使用该模块将会增加负担。否则,它可能会有所帮助。请选择解决问题的答案并奖励相应的作者 :) - sitilge
2个回答

5
您可以启用Apache的mod_mimemod_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

相关文章也在这里:如何使用php让浏览器缓存图片?


以下是需要翻译的内容:


5

有许多技术可供选择,但其中一种较好的技术是采用以下配置:

<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的URL,但实际从磁盘读取的文件只是/i/filename.gif文件名的第1和第3部分。

这个Apache vhost/.htaccess代码块来自于H5BP filename-based_cache_busting.conf文件,该存储库中还有其他良好实践的示例。

结合H5BP mod_expires配置,您将始终能够通过仅更新文件的引用名称来轻松更新用户本地浏览器缓存。


你好@AlisterBulman,如何解决YouTube图片和CSS文件的相同问题? - Emipro Technologies Pvt. Ltd.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接