为什么要使用哈希值作为CSS样式表和Javascript文件名?

6

当深入查看一些最流行的网站代码时,我经常看到CSS和JavaScript文件名像这样:

<link type="text/css" rel="stylesheet" href="//sample.com/css/css__k3sYInttBtNNuJgtPSyqaYy9vVxS4qTZLrfs1ujQB9g__SH_QaIH3bnSp3nOw8n8afhszfHJlxVt51qRlrrrOnk0__fBOuweRojwN82z7EY4v-sVsMwU_P_vZSaU3fmyho6Do.css" media="all" />

<script type="text/javascript" src="//sample.com/js/js__-V23Vc4PVahQcqfyxss_rmNogErBARnPCvI7oPXC0qQ__O-yO5Gg8pRRaefl4d0X9qXUJTOSHq0yazxF-4tJCU_k__fBOuweRojwN82z7EY4v-sVsMwU_P_vZSaU3fmyho6Do.js"></script>

似乎文件名已经进行了哈希处理,我不知道原因。所以我遇到了以下问题:
  1. 使用这种方法的目的是什么?

  2. 我也看到过非常复杂的文件夹名称。为什么会这样?

  3. 是否存在任何安全问题?

  4. 我们能否使用PHP动态更改文件/文件夹名称以实现最大安全性?

我对这个领域有点新。

4
如果打包被重新构建,哈希值会改变,并且浏览器知道它需要更新缓存的资源。 - MysterX
2
这些名称是通过自动化脚本生成的。它可以防止名称冲突并停止浏览器缓存问题。 - bassxzero
那个。它们是在捆绑过程中生成的。 - Reinstate Monica Cellio
@MysterX 如果你添加版本号,像这样 http://wxample.com/.../abc.js?v=0.5.3,那也可以工作,对吧? - mrid
是的,大多数现代浏览器都可以很好地处理这种语法,但是几年前一些旧版本的浏览器仅根据文件名进行缓存。此外,在开发过程中,您的版本号不会更改,您可能会测试许多次具有相同CSS或JS文件的页面,因此与其担心版本号(在开发环境中不会更改),还不如包含日期或时间戳,或哈希值... - Tadasbub
1个回答

8
您可以假设这些文件/文件夹名称并不是开发人员在开发阶段使用的名称,而是文件构建过程中的产物。JavaScript和CSS通常从多个源文件构建成一个单独的文件,涉及更多或更少的编译/转换和捆绑步骤。
之所以希望文件名包含文件的哈希值,是因为这会在文件更改时强制进行缓存失效。静态文件可以被浏览器、服务器和许多其他代理缓存。只要文件没有更改,这是可以接受的。然而,当发布新版本时,用户应该得到这个新版本。如果资源的文件名更改,浏览器将始终从服务器请求文件的新版本,而不是使用缓存版本。
您不应该将像这样的复杂文件名作为安全/授权功能的依赖。文件名在应用程序的索引文件中被引用,因此已知于最终用户。此外,安全性通过混淆通常是一个坏主意。

如果您添加版本号,例如 http://wxample.com/.../abc.js?v=0.5.3,它会不起作用吗?浏览器会带上完整的URL以及任何参数(如果存在),对吧? - mrid
@mrid 是的,那也可以解决问题。但是没有必要保持文件名可读性,因为在一个良好设置的构建/部署过程中,没有人会接触它们。此外,这种方法需要开发人员维护某种版本控制方案,而文件哈希可以完全自动计算。 - TimoStaudinger

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