如果我决定使用javascript或css文件的last_modified_time,并使用它的unix时间戳作为修改文件时胸围缓存的名称中的键。 以下两种做法有什么区别? filename是:my_script.js,时间戳是:1321951817
1 /文件包含在:
<script type="text/javascript" src="http://example.com/js/my_script.js?v=1321951817"></script>
因此,每次v
更改时,查询字符串参数都会创建一个新缓存。
2 /文件包含在:
<script type="text/javascript" src="http://example.com/js/my_script.1321951817.js"></script>
文件名随每次修改而变化,重写规则会删除时间戳并将请求的网址指向my_script.js
3 / 更新:基于以下答案的更多方法:文件已重命名并包含在:
<script type="text/javascript" src="http://example.com/js/my_script.1321951817.js"></script>
文件名已更改,并且未使用REWRITE RULE。
问题:这两种技术本质上是否相同,或者使用查询字符串参数而不是直接文件名是否有任何优点/缺点。
答案 0 :(得分:22)
使用更新的查询字符串是一个糟糕的解决方案。看看史蒂夫博士对此有何看法:http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/
理想的方法是重命名文件本身。 有些人更喜欢使用上次修改日期的时间戳,我认为这是一个问题。
在现代Web开发中,您确实需要尽可能优化页面,这意味着将css和javascript组合成单个文件,这些文件是minfied。 这意味着您在流程中引入了构建步骤,并且文件的最后修改时间始终位于您的上一次构建中。如果将其设置为文件名,则基本上会破坏用户缓存,有时则不需要。
我建议将文件重命名为其内容的md5总和。这样您就可以一直进行新的构建,但只有在内容发生变化时才会更改文件名。这使您的文件名成为内容的标识符。使用此功能,您可以在所有静态内容上设置远期未来的标题,并且不再担心它。
我可以推荐使用构建系统,因为这个工作流程很快。 我的公司前一段时间开源,在优化您的网页的许多其他事情中执行此操作:https://github.com/One-com/assetgraph-builder 还有许多其他构建工具也可以这样做。环顾四周,找到最适合您的开发设置的那个。
答案 1 :(得分:6)
您自己说的是:在第二个示例中,您使用的是重写规则,它会在您加载的每个页面上使用正则表达式进行检查。
第一个只是欺骗浏览器认为它是一个不同的文件。所以第一个就是要走的路。