【问题标题】:How to add "version" query strings to the URLs of the static resources of a web-page?如何将“版本”查询字符串添加到网页静态资源的 URL?
【发布时间】:2012-01-27 00:26:04
【问题描述】:

我注意到 Stack Overflow 添加了?v=xxxxxxxxxxxx:

绑定到网页的脚本和样式表。这与Cache-Control 响应头一起使用

Cache-Control   max-age=604800

为那些静态资源发送的,确保相同的脚本或样式表被缓存(在浏览器中)一周。

我想使用这种技术。您能告诉我该查询字符串是如何添加到 URL 中的吗?我的源代码如下所示:

<script src="js/script.js"></script>

<link href="css/style.css" rel="stylesheet">

我假设v 的值由文件的 Last-Modified 值决定。这是否意味着对于我的.php 网页的每个 请求,我必须访问每个 静态资源的最后修改信息? (我觉得这会影响性能。)

【问题讨论】:

  • 请注意,查询字符串不是对静态资产进行版本控制的最佳解决方案。在文件名中涉及文件哈希的解决方案更好,因为它们仅在文件的字节更改时才会更改。此外,一些(较旧的?)浏览器在搜索缓存时会忽略查询字符串。我推荐grunt-hashrestheasta.net/talks/2013-05-22/# 或 google 的另一个起点。

标签: php javascript css apache caching


【解决方案1】:

一般来说,为方便起见,我将filemtime() 附加为 GET 参数。有些人会在版本控制中附加一个数字,例如修订号。

【讨论】:

  • 我担心性能。为每个页面请求的每个静态资源调用filemtime() 可以吗?
  • 无论如何计算 GET 参数(我认为 filetime() 是个好主意),它(大多数情况下)静态包含在 HTML 中,因此不会影响性能。
  • @ŠimeVidas 俗话说,分析它,看看它是否是你的应用程序的瓶颈。它从未在我的任何网站上引起我的担忧。如果有问题,您可能需要使用不同的指标。
  • @alex filemtime() 与从数据库读取(性能方面)相比如何?我可以在数据库中有一个带有版本信息的“静态资源”表。然后,我将手动运行脚本来更新该表(每当我更改静态资源时),PHP 页面将从该表中检索 v 值。
【解决方案2】:

不同(版本)页面模板将需要不同版本的 .js 和 .css - 因此您可以将依赖版本字符串静态嵌入到页面模板中。

【讨论】:

  • 我不确定页面模板是什么(在这种情况下),但我有一个 article.php 页面,它根据 ID 生成不同的文章(例如 article.php?id=007)。如何静态嵌入?
  • 我很肯定你的 article.php 不会从硬编码值中回显所有 HTML,但要么直接在 article.php 文件中包含一些静态 HTML(包括我在内的一些人认为不好的样式),或者直接或通过模板解析引擎包含一些静态 HTML。 HTML 渲染的这个静态部分是我的意思的页面模板。
  • 嗯,是的。我的.php 文件几乎是 HTML 代码。只有几个 &lt;?php ... ?&gt; 块。 (等等,这种风格很糟糕吗?)我不知道如何“静态嵌入依赖版本字符串”。你能解释一下吗?
  • @ŠimeVidas Som 在您的 HTML 中会有类似 &lt;script src="js/script.js"&gt;&lt;/script&gt; 的内容,您可以将其替换为 &lt;script src="js/script.js?v=XXXXXXX"&gt;&lt;/script&gt;,其中版本 XXXXXXX 是适合此 HTML 的版本。一旦您更改(并测试,等等等等)新版本的 JS 或 HTML 适应 XXXXXXX
  • 嗯,是的,这会起作用,但这也意味着每当我更改绑定到它的任何静态资源时,我都必须手动编辑 PHP 页面。这似乎不是一个合理的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2018-07-14
  • 2013-06-27
相关资源
最近更新 更多