作者:激越工作室 | 来源:互联网 | 2023-07-05 10:46
我想要做的是在javascript路径的末尾添加一个查询字符串,以便每当我的应用程序更新到新版本时,都会下载javascript.但是,只要查询字符串相同,我希望它继续使用缓存版本
我想要做的是在Javascript路径的末尾添加一个查询字符串,以便每当我的应用程序更新到新版本时,都会下载Javascript.但是,只要查询字符串相同,我希望它继续使用缓存版本而不执行http请求来检查脚本是否已更改.
我在PHP中完成此操作的方法是从CVS标记中读取.当我构建HTML输出时,我读取CVS标记并使用它附加到Javascript路径的末尾,以便它创建一个如下所示的脚本标记:
只要应用程序没有更改,标记将保持不变,因此查询字符串也将保持不变.浏览器应该缓存JS并且根本不做网络请求,因为过期日期是远期的.每次更新应用程序时,该查询字符串都将更改,浏览器应下载该查询字符串.
这在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中的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
解决方法:
Firefox使用逻辑来决定是否在给定缓存响应的情况下进行条件GET,如下所示:
>如果存在相关的Vary标头,请重新验证.
>如果此请求应从缓存强制加载,请不要重新验证.
>如果此请求具有“始终验证”标志,请重新验证.
>如果此请求具有“never validate”标志,则仅在这是无存储响应或SSL无缓存响应时重新验证.
>如果响应状态代码不可缓存或响应为no-cache或
无存储或如果到期时间早于响应日期,则重新验证.
>如果存在查询参数且响应没有明确的Expires或max-age,请重新验证.
>如果响应过期时间是过去的,则重新验证(除非“仅设置每个会话用户首选项重新验证一次”).
因此,对于您的情况,假设您实际设置了200响应的expires或max-age信息,则不应该有条件GET.
也就是说,尝试跟踪Firefox的HTTP信息的一些工具实际上会影响重新验证行为,因此您可能会遇到这种情况.
我建议按照https://developer.mozilla.org/en/HTTP_Logging中的步骤创建日志,如果你能找到正确的日志部分(从函数中搜索“nsHttpChannel :: CheckCache enter”),它会顺便告诉你为什么要进行条件GET.实现上述逻辑).