我希望能够检测浏览器是否支持SNI - 服务器名称指示。我希望将不兼容的客户端重定向到另一个地址。
我考虑通过SSL加载一些内容,并确保其安全传输,否则浏览器不支持SNI。这可以做到吗?
我希望能够检测浏览器是否支持SNI - 服务器名称指示。我希望将不兼容的客户端重定向到另一个地址。
我考虑通过SSL加载一些内容,并确保其安全传输,否则浏览器不支持SNI。这可以做到吗?
RewriteEngine on
# Test if SNI will work and if not redirect to too old browser page
RewriteCond %{HTTPS} on
RewriteCond %{SSL:SSL_TLS_SNI} =""
RewriteRule ^ http://www.example.com/too-old-browser [L,R=307]
#Set $_SERVER['SSL_TLS_SNI'] for php = %{SSL:SSL_TLS_SNI} or value
SetEnv SSL_TLS_SNI %{SSL:SSL_TLS_SNI}
SSL_TLS_SNI
变量的重定向不起作用。 - Simon East在需要使用SNI之前,您只能测试是否支持它。也就是说,您不能强制用户使用SNI HTTPS,然后在不支持时回退,因为他们将收到类似于以下错误(来自Windows XP上的Chrome),没有继续的方法。
远程脚本
从您的普通HTTP页面加载一个来自目标SNI HTTPS服务器的<script>
,如果脚本正确加载和运行,您就知道浏览器支持SNI。
跨域AJAX(CORS)
与选项1类似,您可以尝试从HTTP页面执行跨域AJAX请求到HTTPS页面,但请注意CORS仅有有限的浏览器支持。
嗅探用户代理
这可能是最不可靠的方法,您需要在已知不支持它的浏览器(和操作系统)的黑名单或已知支持它的系统的白名单之间做出决定。
我们知道,在Windows XP及以下版本中,所有IE、Chrome和Opera都不支持SNI。请参阅CanIUse.com以获取完整支持的浏览器列表。
自从commercerack为所有站点升级到SNI后,我们遇到了同样的问题。(用户开始结账并遇到严重的SSL问题)。
请随意使用此作为起点。 随着浏览器列表的增长,我会进行更新,但现在它可以在IE上运行XP + Android 2.0-2.2。
https://github.com/brianhorakh/html-sni-useragent-sniffer-warning