将非SNI浏览器redirect到nginx中仅HTTP的警告页面

当使用仅SNI证书(让我们encryption,CloudFlare免费)时,使用Windows或Chrome浏览器或IE浏览器的用户无法连接到您的网站 。 在XP上的Firefox工作正常。

我想testing用户代理是XP上的Chrome还是XP上的IE(或者是不是Firefox的XP上的),并将它们redirect到一个HTTP警告页面,告诉他们在XP上使用Firefox。

你将如何在nginx下做到这一点?

目前,我正在使用此块将所有http链接redirect到https

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

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

您可以使用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的lib,所以我们应该更好地将这个浏览器列入白名单,即使在XP上也是如此第二张地图呢。 第三张地图只是把这两个条件结合在一起。

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

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

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

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