【问题标题】:Lazy Upgrade to HTTPS (TLS/SSL)延迟升级到 HTTPS (TLS/SSL)
【发布时间】:2014-05-11 13:31:48
【问题描述】:

HTTP 速度快(在初始页面加载时),而 HTTPS 是安全的。我有一个站点 example.com,仅在用户登录时才需要安全(它使用安全 cookie 进行身份验证)。

速度是第一印象中最重要的因素之一,我想提供正常的 HTTP 页面 (http://example.com),然后使用 Javascript 懒惰地升级到 HTTPS。

if ( location.protocol === 'http:' ) {
    $.ajax({
        url: 'https://example.com',
        cache: true,
        success: function() {
            window.top.location.replace('https://example.com');
        }
    );
}

这样做会导致页面在新页面加载时“闪烁”。有没有一种方法可以让用户不那么明显?

【问题讨论】:

    标签: javascript html ssl https


    【解决方案1】:

    flash 来自于从第二个https url 加载 assets/css/images 等。

    虽然http 速度更快,但将网站的面向公众的部分设为https 会带来 SEO 优势,这将解决双域问题。

    预取

    如果他们在登录屏幕上并且您知道他们很快就会被重定向到安全的 https 版本,您可以开始在 https 协议上预加载资产。

    一些 HTML5 预取可能会很好,How can I preload a page using HTML5?

    <link rel="prefetch" href="/path/to/prefetch" />

    与 https 一致的资产链接

    您可以使用 https 协议链接到 http 站点上的所有资产,无需预加载。这可能会给不在 https 版本上的任何人增加开销。因此,您可能只想通过 https 加载徽标/标题图形和 css/js。这将改善当域切换主要资产和样式时的感知性能,并且样式会像任何其他重新加载一样迅速到位。

    CDN

    最终的解决方案是将资产推送到像亚马逊网络服务这样的内容交付网络。因此,两个域都加载相同的资产,您必须使用https,否则在https 域上链接到http 时会收到警告。当用户切换浏览器时,浏览器已经保存了所有资产的缓存副本。这通常会加快页面加载速度。由于浏览器的并发请求限制(6 - 8 之间),这意味着您的服务器将交付 HTML 等重要内容,并且浏览器可以同时从 CDN 加载资产。

    SPDY

    回到主题,考虑到协议升级,我将开始研究 Google 的 SPDY。 Chrome Firefox Opera & IE11 都有支持。它比 HTTP 或 HTTPS 安全且更快。再加上从 CDN 加载的一些 WEBP 图形,您将面临接近光速的危险。 http://en.wikipedia.org/wiki/SPDY#Browser_support_and_usage

    【讨论】:

    • 这篇 2009 年的文章建议不要升级到 SPDY,因为强制 SSL 加密和 gzip 压缩会产生开销,“这将比传统 HTTP 更难地打击服务器和客户端 CPU”显然它将取决于很多在您的特定网站和您的用户群上,但如果您想要避免“新页面加载时的“闪现””,您可能需要考虑这个因素。 arstechnica.com/business/2009/11/…
    • 如果您想通过更快地加载页面来减少页面加载引起的闪烁,您需要将页面加载时间保持在最接近人眼无法察觉的毫秒数。这个数字通常只有几毫秒。来自 Wikipedia “当看到一个亮着的显示器时,如果大约 16 毫秒或更长时间,人们会开始注意到短暂的黑暗中断。” en.wikipedia.org/wiki/Frame_rate
    • Google 的另一项旨在加快下载和渲染速度的举措。 “谷歌表示,使用 mod-pagespeed 通常可以将大型网站的下载时间减半。” techcrunch.com/2012/10/10/… 关于内容交付网络解决方案,请确保可以缓存通过 HTTPS 提供的资源。 web-caching.com
    【解决方案2】:

    你想要你只能在 php 中完成。

    if($_SERVER['SERVER_PORT'] != 443) {
      $url = "https://{$_SERVER[HTTP_HOST]}{$_SERVER[REQUEST_URI]}";
      header("Location: $url");
      exit;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-04
      • 2017-02-25
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2023-04-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多