我们正在使用 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 版本。怎么做最好?
我看到它的方式有两个问题:
浏览器无法获取应用程序清单(因为它是重定向)。因此无法将应用程序升级到新版本。
我们或许可以通过配置我们的服务器以允许
/.appcache
通过纯 HTTP 提供服务来克服这个问题。即使我们这样做,应用程序仍将在 HTTP 位置被访问(因为清单缓存的内容)
为了解决这个问题,我们可能必须实现某种将方案更改
document.location.href
为 HTTPS 的 javascript 逻辑。我不喜欢这种方法,但这是我们目前唯一的方法。