由于SNI发生在SSL / TLS握手期间,因此当客户端连接到HTTP时无法检测到浏览器支持。
所以,你是对的。用户代理过滤器是执行此操作的唯一方法。
最大的问题是,您是否要对已知不会监听SNI的浏览器执行黑名单操作,还是要对已知支持该功能的浏览器加入白名单。晦涩或无法使用该网站的新设备似乎是一个破坏交易的事情,因此我想说,白名单可能是更好的选择。
在您的HTTP中<VirtualHost>
:
# Internet Explorer 7, 8, 9, on Vista or newer
RewriteCond %{HTTP_USER_AGENT} MSIE\s7.*Windows\sNT\s6 [OR]
RewriteCond %{HTTP_USER_AGENT} MSIE\s8.*Windows\sNT\s6 [OR]
RewriteCond %{HTTP_USER_AGENT} MSIE\s9.*Windows\sNT\s6 [OR]
# Chrome on Windows, Mac, Linux
RewriteCond %{HTTP_USER_AGENT} Windows\sNT\s6.*Chrome [OR]
RewriteCond %{HTTP_USER_AGENT} Macintosh.*Chrome [OR]
RewriteCond %{HTTP_USER_AGENT} Linux.*Chrome [OR]
# Firefox - we'll just make the assumption that all versions in the wild support:
RewriteCond %{HTTP_USER_AGENT} Gecko.*Firefox
RewriteRule ^/(.*)$ https://ssl.hostname/$1 [R=301]
这也是黑名单选项-请记住,这冒着将不使用SNI的客户端发送到需要SNI的站点的风险,但另一方面,会将诸如IE 10之类的新内容发送给用户地点:
# IE 6
RewriteCond %{HTTP_USER_AGENT} !MSIE\s6
# Windows XP/2003
RewriteCond %{HTTP_USER_AGENT} !Windows\sNT\s5
# etc etc
RewriteRule ^/(.*)$ https://ssl.hostname/$1 [R=301]
那里有很多浏览器。我对表达式的描述一直很松散,并且没有涉及很多浏览器-这可能会变成维护噩梦。
无论您选择哪个选项..祝您好运!