这个解决方案是用 PHP 编写的,但它应该很容易适应其他语言。
原始的.htaccess
正则表达式可能会导致文件出现问题,例如json-1.3.js
. 解决方案是仅在末尾正好有 10 位时才重写。(因为 10 位数字涵盖了从 2001 年 9 月 9 日到 2286 年 11 月 20 日的所有时间戳。)
首先,我们在 .htaccess 中使用以下重写规则:
RewriteEngine on
RewriteRule ^(.*)\.[\d]{10}\.(css|js)$ $1.$2 [L]
现在,我们编写以下 PHP 函数:
/**
* Given a file, i.e. /css/base.css, replaces it with a string containing the
* file's mtime, i.e. /css/base.1221534296.css.
*
* @param $file The file to be loaded. Must be an absolute path (i.e.
* starting with slash).
*/
function auto_version($file)
{
if(strpos($file, '/') !== 0 || !file_exists($_SERVER['DOCUMENT_ROOT'] . $file))
return $file;
$mtime = filemtime($_SERVER['DOCUMENT_ROOT'] . $file);
return preg_replace('{\\.([^./]+)$}', ".$mtime.\$1", $file);
}
现在,无论您在哪里包含您的 CSS,都将其更改为:
<link rel="stylesheet" href="/css/base.css" type="text/css" />
对此:
<link rel="stylesheet" href="<?php echo auto_version('/css/base.css'); ?>" type="text/css" />
这样,您无需再次修改链接标签,用户将始终看到最新的 CSS。浏览器将能够缓存 CSS 文件,但是当您对 CSS 进行任何更改时,浏览器会将其视为新 URL,因此它不会使用缓存的副本。
这也适用于图像、网站图标和 JavaScript。基本上任何不是动态生成的。