0

我们正在使用 HTML5 应用程序缓存功能:

<html manifest=".appcache">
   ...
</html>

当返回的用户导航到这个应用程序时,他们已经缓存了所有静态文件,因此在没有网络请求的情况下加载了应用程序。

一旦应用程序被加载,它将发出 AJAX 请求以加载动态内容,并且浏览器将检查应用程序缓存清单是否已过时,并可能在后台下载应用程序的新版本。

我们的许多用户正在通过不安全的连接(HTTP,而不是 HTTPS)访问此应用程序。

我们正在在托管应用程序的服务器上引入 HTTP 严格传输安全 (HSTS)。

实施 HSTS 意味着我们的服务器将处理如下请求:

  • 如果请求不安全(仅限 HTTP),则服务器将以 HTTP 状态 301 和Location重定向到请求的 URI 但将方案更改为https.

  • 否则; 如果请求是安全的(HTTPS),服务器将照常处理它,但用Strict-Transport-Security标头装饰响应。

因此,当新用户通过 HTTP 打开我们的应用程序时,他们将被重定向到 HTTPS,然后使用安全位置安装应用程序缓存清单。那很完美。

但是,返回的用户(通过 HTTP)将不会被重定向到安全位置(因为他们已经在不安全的位置有缓存版本)。应用程序缓存清单不会加载(因为它是重定向)。因此,返回的用户会被他们缓存的应用程序版本卡住,并且他们使用不再被允许的 HTTP 卡住了。这很糟糕

我们需要想出一种方法来将返回的 HTTP 用户转换为 HTTPS 版本。怎么做最好?

我看到它的方式有两个问题:

  1. 浏览器无法获取应用程序清单(因为它是重定向)。因此无法将应用程序升级到新版本。

    我们或许可以通过配置我们的服务器以允许/.appcache通过纯 HTTP 提供服务来克服这个问题。

  2. 即使我们这样做,应用程序仍将在 HTTP 位置被访问(因为清单缓存的内容)

    为了解决这个问题,我们可能必须实现某种将方案更改document.location.href为 HTTPS 的 javascript 逻辑。

    我不喜欢这种方法,但这是我们目前唯一的方法。

4

1 回答 1

0

针对这个问题,我们确定了以下解决方案:

当服务器接收到获取应用程序缓存清单的不安全请求(/.appcache在我们的示例中)时,将返回 404 响应而不是正常的 HTTPS 重定向 (301)。

获取 404 会导致缓存清单过时,因此浏览器将尝试在下一次刷新时重新加载应用程序,这将导致应用程序获取index.html并重定向到安全位置。

于 2017-02-16T09:18:23.267 回答