我有一个带有缓存清单的 HTML5/Javascript(服务器上的 PHP/MySQL)应用程序,它在除 Firefox 之外的几乎所有移动和桌面浏览器上运行良好。
当我删除缓存清单时,它在 Firefox 中运行良好。因此,我无法弄清楚 Firefox 中的缓存清单有些奇怪。它正在从缓存中加载文件,即使该文件发送了 Cache-Control: no-store, no-cache 标头。
该文件处理用于获取 LinkedIn 访问令牌的 OAuth 舞蹈,并遵循以下步骤:
- 该应用程序使用 window.location.replace('file.php') 通过 Javascript 调用文件
- file.php 加载并被重定向到 file.php?param=initiate
- file.php?param=initiate 加载,从 LinkedIn 获取请求令牌,然后重定向到 LinkedIn 授权页面,然后被重定向到 file.php?param=initiate&otherparameters
- file.php?param=initiate&otherparameters 加载,otherparameters 用于从 LinkedIn 获取访问令牌,然后重新加载应用程序,因为它现在具有访问权限。
但是,在 Firefox(Windows 7 上的 16.0.2)上,我得到以下信息:
- 该应用程序使用 window.location.replace('file.php') 通过 Javascript 调用文件
- file.php 加载并被重定向到 file.php?param=initiate(FireBug 显示找到状态 302,响应标头显示位置 /file.php?param=initiate)
- file.php?param=initiate 加载,从 LinkedIn 获取请求令牌,但不重定向到 LinkedIn 授权页面:它显示 404 页面(FireBug 显示找到状态 302,响应标头显示位置 https:linkedin.com/身份验证链接,但 Firefox 没有转到 LinkedIn 页面,它对 file.php?param=initiate 发出另一个 GET 请求并从缓存中加载它:状态 200 OK(BF 缓存)并显示 404 页面)。
file.php 不在缓存清单中。
基本上,它不会从步骤 3 转到响应标头中的 Location 应该将其带到 LinkedIn 授权页面,但我不知道为什么不这样做。
有想法该怎么解决这个吗?
如果你想重现这个问题,这里有一个测试事件的链接。尝试发送 LinkedIn 连接请求并观看 Firebug。此活动的所有 LinkedIn 个人资料(我的除外)都是虚拟个人资料,因此不必担心向随机陌生人发送 LinkedIn 连接请求。您必须先使用您的电子邮件注册才能获得激活链接,但如果您愿意,可以使用一次性电子邮件地址。
我尝试过的一些事情:
- 没有缓存清单:这修复了它,但我需要离线功能
- 发送带有 no-store、no-cache、must-ravalidate、过去过期日期等各种排列的标头。
- 减少缓存清单中的条目数
- SETTINGS 的各种组合:prefer-online、NETWORK:*、NETWORK:https://* 等。