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

Jon*_*ett 5 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>
Run Code Online (Sandbox Code Playgroud)

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

这在IE8中很有用.我的问题是Firefox.Firefox缓存文件,但下次加载页面时,Firebug会显示304响应,表明它仍然对该文件发出网络请求,然后发现它没有更改.

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

相关:firefox决定不缓存什么? 显然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
Run Code Online (Sandbox Code Playgroud)

Firebug中的Cache选项卡说:

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
Run Code Online (Sandbox Code Playgroud)

Bor*_*sky 6

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

  1. 如果有相关的Vary标头,请重新验证.
  2. 如果此请求应该从缓存强制加载,请不要重新验证.
  3. 如果此请求具有"始终验证"标志,请重新验证.
  4. 如果此请求具有"never validate"标志,则仅在这是无存储响应或SSL无缓存响应时重新验证.
  5. 如果响应状态代码不可缓存或响应为no-cache或no-store,或者如果到期时间早于响应日期,则重新验证.
  6. 如果存在查询参数且响应没有明确的Expires或max-age,请重新验证.
  7. 如果响应过期时间是过去的,则重新验证(除非"仅设置每个会话用户首选项重新验证一次").

因此,对于您的情况,假设您实际设置了200响应的expires或max-age信息,则不应该有条件GET.

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

我建议按照https://developer.mozilla.org/en/HTTP_Logging中的步骤创建一个日志,如果你能找到正确的日志部分(搜索",那么它将顺便告诉你为什么要进行条件GET) nsHttpChannel :: CheckCache输入"用于从实现上述逻辑的函数进行日志记录".