Apache-2.2

僅當瀏覽器支持 SNI 時才重定向到 SSL

  • September 6, 2016

我有帶有 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]

那裡有很多瀏覽器。我對錶達式非常鬆散,並且沒有涵蓋很多瀏覽器 - 這可能會變成維護的噩夢。

無論您選擇哪個選項.. 祝您好運!

引用自:https://serverfault.com/questions/389806