【问题标题】:Redirecting non-SNI browsers to HTTP-only warning page in nginx将非 SNI 浏览器重定向到 nginx 中的仅 HTTP 警告页面
【发布时间】:2016-02-24 13:31:11
【问题描述】:

当使用仅 SNI 证书(Let's Encrypt,CloudFlare 免费)时,使用带有 Chrome 或 IE 的 Windows XP 的用户是not able to connect to your site。 XP 上的 Firefox 运行良好。

我想测试用户代理是 XP 上的 Chrome 还是 XP 上的 IE(或 XP 上不是 Firefox 的任何东西),并将它们重定向到一个 HTTP 警告页面,告诉他们在 XP 上使用 Firefox。

在 nginx 下你会怎么做呢?

目前,我正在使用此块将所有 http 链接重定向到 https。

if ($http_cf_visitor ~ '{"scheme":"http"}') {
    return 301 https://$server_name$request_uri;
}

如何将上述用户代理检测合并到此块中,以便将非 SNI 用户重定向到仅 HTTP 警告页面?

【问题讨论】:

    标签: nginx browser https windows-xp sni


    【解决方案1】:

    您可以使用 nginx 用户代理映射来检测和重定向非 SNI 客户端(XP 上的 IE 和 Chrome 浏览器)。只需将其放入站点配置文件(服务器块外部):

    map $http_user_agent $is_xp {
        default 0;
        "~Windows NT 5.1" 1;
    }
    
    map $http_user_agent $whitelist_browser {
        default 0;
        "~Firefox" 1;
    }
    
    map $is_xp$whitelist_browser $no_sni {
        default 0;
        "10" 1;
    }
    

    第一个映射在用户代理字符串 (=Windows XP) 中检查 Winhdows NT 5.1,但是因为 Firefox 不依赖 XP 的 SSL 实现并且有自己的支持 SNI 的库,所以我们最好将该浏览器列入白名单,即使在 XP 上也是如此是第二张地图的作用。第三张地图只是将这两个条件结合在一起。

    所以现在我们可以在服务器块中使用它来做我们想做的事:

        if ($no_sni = 1) {
            # do whatever (redirect...???)
        }
    

    但是!!! 此解决方案仅适用于将您的 URL 直接输入到地址栏的访问者(浏览器默认为 HTTP)。想象一下,Google(或任何人)抓取您的网站,将其检测为 HTTPS(机器人的用户代理不是 XP 或 IE),当然 将其索引为 HTTPS,它会在搜索结果中将其显示为 HTTPS页!因此,使用 NON-SNI 客户端的用户将被直接从搜索重定向到 HTTPS,而您又遇到了麻烦。

    唯一的解决方法是从 CA(letsencrypt,...)请求一个大证书,将您服务器上托管的所有域列为 SAN,并将此证书用作默认 SSL 证书。因此,如果任何非 sni 客户端访问您的服务器,它将获得包含所有域的通用证书,一切都会好起来的。

    【讨论】:

      猜你喜欢
      • 2013-08-25
      • 2012-07-23
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 2017-12-28
      • 2016-10-18
      • 2016-01-07
      • 2014-02-02
      相关资源
      最近更新 更多