javascript - 如果路径中有查询字符串,Firefox 是否会缓存 javascript 并在没有请求的情况下使用它?

标签 javascript firefox caching firefox6

我想做的是在 javascript 路径的末尾附加一个查询字符串,这样每当我的应用程序更新到新版本时,就会下载 javascript。但是,只要查询字符串相同,我就希望它继续使用缓存版本,而无需执行 http 请求来检查脚本是否已更改。

我在 PHP 中完成此操作的方法是从 CVS 标记中读取。当我构建要输出的 HTML 时,我读取 CVS 标记并使用它附加到 javascript 路径的末尾,以便它创建一个如下所示的脚本标记:

<script src="javascript/messages/shipments.js?TPRSAPPS-DEV2_090828145712237-BRANCH" type="text/javascript"></script>

只要应用没有改变,标签就会保持不变,因此查询字符串也会保持不变。浏览器应该缓存 JS 并且根本不执行网络请求,因为过期日期是遥远的 future 。每次更新应用程序时,该查询字符串都会更改,浏览器应下载它。

这在 IE8 中效果很好。我的问题是 Firefox。 Firefox 缓存了文件,但下次我加载页面时,Firebug 显示 304 响应,表明它仍然对该文件进行了网络请求,然后发现它没有改变。

所以我的问题是,当有查询字符串时,firefox会忽略javascript的expires头和缓存吗?

相关:what does firefox decide not to cache? 显然 Rails 做了类似的事情。但这并没有回答我的问题。

这是我收到的关于此文件的回复:

https://appdev.prsx.net/~jhargett/PRSApps-Motorlog/javascript/menuReader.js?TPRSAPPS-DEV2_090828145712237-BRANCH-DIFFERENT

HTTP/1.1 304 Not Modified
Date: Mon, 03 Oct 2011 18:35:26 GMT
Server: Apache/2.2.3 (Red Hat)
Connection: close
Etag: "179010-3f8-49a9a74334200"
Vary: Accept-Encoding

Firebug 中的缓存选项卡显示:

Last Modified   Mon Oct 03 2011 13:35:26 GMT-0500 (Central Daylight Time)
Last Fetched    Mon Oct 03 2011 13:35:26 GMT-0500 (Central Daylight Time)
Expires Fri Oct 28 2011 18:33:31 GMT-0500 (Central Daylight Time)
Data Size   345
Fetch Count 12
Device  disk

最佳答案

Firefox 用于决定是否在给定缓存响应的情况下进行条件 GET 的逻辑如下所示:

  1. 如果有相关的 Vary header ,则重新验证。
  2. 如果应该从缓存中强制加载此请求,则不要重新验证。
  3. 如果此请求具有“始终验证”标志,则重新验证。
  4. 如果此请求具有“从不验证”标志,则仅当这是无存储响应或 SSL 无缓存响应时才重新验证。
  5. 如果响应状态码不可缓存或者响应是无缓存的或者 无存储或如果过期时间早于响应日期,则重新验证。
  6. 如果有查询参数并且响应没有明确的过期时间或最大年龄,则重新验证。
  7. 如果响应过期时间已过去,则重新生效(除非设置了“每个 session 用户首选项仅重新生效一次”)。

因此,对于您的情况,假设您实际上在 200 响应中设置了过期或最大期限信息,则不应有条件 GET。

也就是说,一些尝试跟踪 Firefox 的 HTTP 信息的工具实际上会影响重新验证行为,因此您可能会遇到这种情况。

我建议按照 https://developer.mozilla.org/en/HTTP_Logging 中的步骤创建日志如果您能找到日志的正确部分(搜索“nsHttpChannel::CheckCache enter”以获取实现上述逻辑的函数的日志记录),它会顺便告诉您执行条件 GET 的确切原因。

关于javascript - 如果路径中有查询字符串,Firefox 是否会缓存 javascript 并在没有请求的情况下使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7639497/

相关文章:

javascript - 用于对象数据加载的 removeEventListener

css - Mozilla Firefox 边框渲染

java - 更改 JAVA DNS 缓存设置

jquery - FireFox 不发送 CORS 请求(使用 jQuery)

c# - 从 Xml 文件读取最有效和缓存的方式

java - 当通过sql过程发生表更新时更新spring缓存

客户端数据结构的 JavaScript 加密(或混淆)

javascript - 使用 Shopify Javascript Buy SDK 通过句柄检索产品

javascript - 如何将本地 JavaScript 文件导入 NodeJS TypeScript 项目?

google-chrome - Chrome 中的“检查元素”显示 LESS,但 Firefox 显示 CSS