更奇怪的Firefox缓存清单行为:重定向到外部域导致404失败

时间:2012-11-14 19:21:45

标签: html5 firefox browser-cache cache-manifest html5-appcache

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

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

该文件处理OAuth舞蹈以获取LinkedIn访问令牌并执行以下步骤:

  1. 该应用使用window.location.replace通过Javascript调用该文件(' file.php')
  2. file.php加载并重定向到file.php?param = initiate
  3. file.php?param =启动加载,从LinkedIn获取请求令牌,然后重定向到LinkedIn授权页面,然后重定向到file.php?param = initiate& otherparameters
  4. file.php?param = initiate& otherparameters load,其他参数用于从LinkedIn获取访问令牌,然后重新加载应用程序,因为它现在可以访问。
  5. 但是,在Firefox(Windows 7上的16.0.2)上,我得到以下内容:

    1. 该应用使用window.location.replace通过Javascript调用该文件(' file.php')
    2. file.php加载并重定向到file.php?param = initiate (FireBug显示Status 302 Found,响应头显示位置/file.php?param=initiate)
    3. file.php?param =启动加载,从LinkedIn获取请求令牌,但不会重定向到LinkedIn授权页面:它显示404页面(FireBug显示Status 302 Found,响应标题显示位置https:linkedin .com / authenication链接,但是Firefox没有进入LinkedIn页面,它会对file.php进行另一个GET请求?param = startup并从缓存中加载它:Status 200 OK(BF Cache)并显示404页面。
    4. file.php不在缓存清单中。

      基本上它没有转到第3步的响应标题中的位置,应该将它带到LinkedIn授权页面,但我无法弄清楚为什么不这样做。

      有关如何解决此问题的任何想法?

      如果您想重现此问题,请here's a link to a test event。尝试发送LinkedIn连接请求并观看Firebug。此活动的所有LinkedIn个人资料(除了我的)都是虚拟个人资料,因此不必担心向随机陌生人发送LinkedIn连接请求。您必须先使用电子邮件注册才能获得激活链接,但如果您愿意,可以使用一次性电子邮件地址。

      我尝试过的一些事情:

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

1 个答案:

答案 0 :(得分:0)

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

经过多次挫折之后,我发现了为什么会出现这个问题,所以希望这会帮助那些面临类似困境的人。

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

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

Here's a useful article on the gotchas of cache manifest(此问题列为问题#8)。

Here's a link to the HTML Offline Spec(这个问题似乎列在第6.7.6(4)节中,但该文件是如此不透明,我无法告诉它是否真正引用它。)