僅當瀏覽器支持 SNI 時才重定向到 SSL
我有帶有 mod_ssl 的 Apache 2.2 和 HTTPS 中的一堆站點,它們位於與 VirtualHosting 相同的 IP/埠上,因此客戶端必須支持 SNI 才能連接到這些虛擬主機。
我想通過以下方式配置我的伺服器:
當使用者鍵入 www.dummysite.com 並且他的瀏覽器支持SNI(伺服器名稱指示)時,任何 HTTP 請求都會重定向到
https://
發送 HSTS 標頭的位置。但如果瀏覽器不支持SNI,則請求由 HTTP 提供。上面的規則,按原樣說,實際上是那些仍然執行舊瀏覽器的人的備份規則,因為 Mozilla 和 Chrome 沒有這個問題,只是為了避免將這些使用者排除在網站之外。
我想在 Apache 配置級別執行此重定向,可能在使用者代理上使用過濾器。我不想接觸正在執行的應用程序,除非確保不存在直接的 http:// 引用(否則它們意味著安全警告)
$$ Edit $$(在編輯問題時我忘記了問題):要重定向的啟用 SNI 的使用者代理列表是什麼?
由於 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]
那裡有很多瀏覽器。我對錶達式非常鬆散,並且沒有涵蓋很多瀏覽器 - 這可能會變成維護的噩夢。
無論您選擇哪個選項.. 祝您好運!