2012-07-24 61 views
8

我有一個強制HTTPS和www的重寫規則。 SSL證書適用於該網站的www版本。整個網站需要是HTTPS。.htaccess重定向僅在瀏覽器警告後執行

問題是如果請求是https://example.com/瀏覽器會在重定向執行之前顯示警告頁面。 (Firefox中的'此連接不受信任'和Chrome中的'這可能不是您要查找的網站')

如果用戶在Firefox中添加異常或忽略Chrome中的錯誤,則執行重寫規則他們將重定向到100%安全頁面的www版本。

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^example.com$ [OR] 
RewriteCond %{HTTPS} !on 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 

RewriteCond %{HTTP_HOST} ^www.example.com$ 
RewriteCond %{HTTPS} !on 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 

我已經在網站上測試的規則,以及對http://martinmelin.se/rewrite-rule-tester/

我怎樣才能重定向到瀏覽器的警告之前執行?

+0

請參閱:http://serverfault.com/a/360985/47187 – Bruno 2012-07-24 22:31:25

+0

可能重複[重定向https到非www和http到www](http://stackoverflow.com/a/10726167/372643)。 – Bruno 2012-07-24 22:59:33

+0

這個問題可能是重複的,但我認爲這裏的問題更清楚一點,恕我直言。 – Jonathan 2012-07-25 07:51:02

回答

8

https://example.comhttps://www.example.com的重定向只能在客戶端向https://example.com發出初始成功請求後纔會發生。

這是因爲HTTPS是基於TLS/SSL的HTTP(請參閱RFC 2818),它首先在發送任何HTTP流量之前建立SSL/TLS連接。 mod_rewrite將始終在SSL/TLS連接建立後應用。不這樣做實際上是一個安全問題,因爲攻擊者可以在證書驗證之前重寫和重定向客戶端。即使TLS升級在HTTP(RFC 2817,它實際上從未使用/支持且不是https)內,您仍然希望重定向來自可信實體。

對於此初始連接工作,在https://example.com服務器必須具有有效的example.com證書,否則,這種連接甚至不會發生(和服務器將不發送重定向響應)。

爲了達到你的目標,你需要爲https://example.com要求出示有效的example.com證書,並請求https://www.example.com出示有效www.example.com證書。

解決辦法有兩個:

  • 使用每個主機上的兩個不同的證書,或者通過使用不同的IP地址,或者通過使用服務器名稱指示。這裏的缺點是並不是所有的客戶都支持SNI,即使它變得越來越普遍。
  • 使用對example.comwww.example.com有效的單一證書。這可以通過獲取具有多個主題備用名稱(SAN)DNS條目的證書來實現(由於該點不是通配符模式的一部分,所以它不會與*.example.com一起使用)。

後者無疑是最簡單的解決方案。當您申請其中一個或另一個時,CA有時會發出擁有SAN條目的證書,這些證書的有效期爲example.comwww.example.com,有時無需支付額外費用。

+0

注意:大多數通配符證書都包含'* .example.com'和'example.com' – cmorrissey 2014-02-07 15:32:33

0

This post地址您的問題,並提供了以下答案:

,如果你想避免無效的證書問題,你需要的example.com一個證書。出於安全原因,不允許在身份驗證之前重定向。

另一個選擇可能是獲得通配證書,這將允許您匹配 *.example.com(顯然這是不行的。感謝@Giel)

你可以做http://example.com/重定向到https://www.example.com/,但可能不會幫助你,如果你已經有用戶訪問https://example.com/

+0

通配符證書是不夠的,因爲後者與前者不匹配,您將需要example.com和* .example.com。 – Giel 2012-07-24 22:32:02