如何使用 apache 设置静态资产缓存?

How to setup static assets caching with apache?

我想优化我们网络中使用的静态资产(.js、.css、...文件)的缓存。我的目标是基于这篇文章 (https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#invalidating-and-updating-cached-responses)。

简而言之 - 因为这些静态资产往往会临时更新(有时每周一次,有时一天两次,......)我想缓存它们以备将来过期并根据内容或修改日期或类似内容。这应该允许将它们缓存很长时间,但一旦发生某些变化就会更新它们。

A​​pache2 服务器支持这种技术吗?或者是否有一些中间件系统可以处理指纹生成(以具有唯一的资产名称)并在 HTML 文件中更新对它们的引用(根本不会被缓存)?

我们在主机上使用 LAMP 堆栈。

提前致谢

您可以为 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>

或分别设置phpheaders

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

此处还有相关文章:How to get the browser to cache images, with php?

有很多技术,有些比其他的要好。一个好的配置是具有以下配置:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.+)\.(\d+)\.(bmp|css|cur|gif|ico|jpe?g|js|png|svgz?|webp|webmanifest)$ . [L]
</IfModule>

这允许形式为 /i/filename.1433499948.gif 的 URL - 但实际从磁盘读取的文件只是文件名的 /i/filename.gif 部分 1 和 3。

此 Apache vhost/.htaccess 节来自 H5BP filename-based_cache_busting.conf 文件,存储库中还有其他良好实践示例。

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