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]
そこには多くのブラウザがあります。私は表現にかなりゆるんでいて、多くのブラウザをカバーしていません-これは維持するのに非常に悪夢に変わる可能性があります。
どちらのオプションを選択しても..幸運を祈ります!