0

我有一个带有缓存清单的 HTML5/Javascript(服务器上的 PHP/MySQL)应用程序,它在除 Firefox 之外的几乎所有移动和桌面浏览器上运行良好。

当我删除缓存清单时,它在 Firefox 中运行良好。因此,我无法弄清楚 Firefox 中的缓存清单有些奇怪。它正在从缓存中加载文件,即使该文件发送了 Cache-Control: no-store, no-cache 标头。

该文件处理用于获取 LinkedIn 访问令牌的 OAuth 舞蹈,并遵循以下步骤:

  1. 该应用程序使用 window.location.replace('file.php') 通过 Javascript 调用文件
  2. file.php 加载并被重定向到 file.php?param=initiate
  3. file.php?param=initiate 加载,从 LinkedIn 获取请求令牌,然后重定向到 LinkedIn 授权页面,然后被重定向到 file.php?param=initiate&otherparameters
  4. file.php?param=initiate&otherparameters 加载,otherparameters 用于从 LinkedIn 获取访问令牌,然后重新加载应用程序,因为它现在具有访问权限。

但是,在 Firefox(Windows 7 上的 16.0.2)上,我得到以下信息:

  1. 该应用程序使用 window.location.replace('file.php') 通过 Javascript 调用文件
  2. file.php 加载并被重定向到 file.php?param=initiate(FireBug 显示找到状态 302,响应标头显示位置 /file.php?param=initiate)
  3. 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 连接请求。您必须先使用您的电子邮件注册才能获得激活链接,但如果您愿意,可以使用一次性电子邮件地址。

我尝试过的一些事情:

  1. 没有缓存清单:这修复了它,但我需要离线功能
  2. 发送带有 no-store、no-cache、must-ravalidate、过去过期日期等各种排列的标头。
  3. 减少缓存清单中的条目数
  4. SETTINGS 的各种组合:prefer-online、NETWORK:*、NETWORK:https://* 等。
4

1 回答 1

0

我通过重写我的 LinkedIn/OAuth 库解决了这个问题,以便它通过 ajax 完成所有操作,而不是通过 PHP 发送 Location 标头。

在经历了很多挫折之后,我弄清楚了为什么会发生这个问题,所以希望这能帮助其他面临类似困境的人。

事实证明,缓存清单不允许重定向到外部域 (这可能记录在某处,但是当我搜索解决方案时它没有显示给我)。

部分问题是我不知道重定向导致了问题。我认为这只是缓存清单的奇怪之处。毕竟,它在 Chrome 和 Safari 上运行良好,而且我没有从 Firebug 获得任何有用的调试信息。

这是一篇关于缓存清单问题的有用文章(此问题被列为问题 #8)。

这是 HTML 离线规范的链接(此问题似乎列在第 6.7.6(4) 节中,但该文档非常不透明,我无法判断这是否真的是它所指的内容)。

于 2012-11-20T15:54:27.450 回答