2014-12-28 82 views
6

所以我的SSL證書只適用於https://example.com - 不是https://www.example.com(不能抱怨,它是免費的)。重定向https:// www到https://非www - 沒有看到證書錯誤,可能嗎?

冒險進入mod_rewrite和大量的閱讀(大部分來自於stackoverflow)我有一個.htaccess文件,其中大部分是我需要的,這裏是該文件(當然還有域名編輯)。

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    #First rewrite any request to the wrong domain to use the correct one 
    RewriteCond %{HTTP_HOST} !^subdomain\. 
    RewriteCond %{HTTP_HOST} ^(www|ftp|mail)\.example\.com [NC] 
    RewriteRule ^(.*)$ http://example.com/$1 [R=301,L] 

    #Redirect these subdomains to a subfolder 
    RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$ 
    RewriteCond %1 !^(www|ftp|mail)$ [NC] 
    RewriteRule (.+)$ "http://example.com/%1" [L,P] 

    #Now, rewrite to HTTPS: 
    RewriteCond %{HTTPS} off 
    RewriteCond %{HTTP:X-Forwarded-Proto} !https 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
</IfModule> 

該腳本包含評論它是什麼(我需要他們比你想象的更多)。 並且在被重定向的子域(在根web文件夾中的子文件夾,具有匹配的子域名)和dns服務器上的附帶dns項的文件夾上有一個額外的.htaccess文件。該文件夾中的.htaccess只會將http(端口80)重定向到https。

目前,它做我所需要的,但我正在尋找更簡單的方法來寫這個。更簡單的說,它也可能意味着更多的全球化(如果它比硬編碼域更快)以及從重寫中獲得任何速度改進。

如前所述,我的證書僅適用於非www的example.com域名,所以這使我想到了第二個(但是我的主要)問題。

像這樣路由的流量:https://www.example.com在執行任何路由,重寫等操作之前將會看到錯誤。這是因爲到這個時候甚至沒有發生過與Web服務器的連接,對嗎?這基本上是你的服務器遞交你的證書和瀏覽器說: 等一下!

有沒有辦法避免交通事故的打你的服務器的方式不當(的https:// WWW)瀏覽器給出了一個證書錯誤之前?

這並不僅限於.htaccess方法。

有沒有辦法做到這一點 - 在所有?那是什麼?

編輯:

我是有我的條件的幾個問題,並重寫擊中查詢它不應該。我也有一些重定向循環,因此前往apache.org來研究它;所以只是作爲一種方法來跟蹤在這裏說的變化是現在的.htaccess文件:

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    # First rewrite any request to the wrong domain to use the correct one 
    RewriteCond %{HTTP_HOST} ^(www|ftp|mail)\.example\.com$ [NC] 
    RewriteRule ^(.*)$ http://example.com/$1 

    # Redirect these subdomains to a subfolder 
    RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$ 
    RewriteCond %{REQUEST_URI} !^([^/.]+)/([^/.]+) 
    RewriteCond %1 !^(www|ftp|mail)$ [NC] 
    RewriteRule ^(.*)$ http://example.com/%1$1 [L,NC,QSA] 

    #Now, rewrite to HTTPS: 
    RewriteCond %{HTTPS} off 
    RewriteCond %{HTTP_HOST} !^$ 
    RewriteCond %{HTTP_HOST} ^http://example\.com/$ [NC] 
    RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [L,R,NE] 
</IfModule> 

回答

8

有沒有辦法避免交通事故的打你的服務器的方式不當(https://開頭WWW)前瀏覽器發出證書錯誤?

不,沒有什麼可以做的,您的評估是正確的,瀏覽器查看服務器證書並看到主機不匹配並顯示錯誤。該錯誤不是由服務器生成的,而且這發生在請求被髮送到服務器之前。這發生在SSL握手期間。您唯一可以做的事情是阻止任何已存在的http://www鏈接,或購買包含「www」的新證書。

至於你的規則,真的沒有辦法簡化它,因爲你有每個規則的多個條件。

+0

謝謝!這證實了我的疑惑。 我相信我可以申請一個同時包含域名(www和非www)(不確定名稱)的證書。 – avluis

+1

@avluis @avluis大多數發行者在域名前包含「www」作爲選項,那麼您可以支付更多的額外子域名或通配證書(所有子域名) –

+0

@JonLin也許一個解決方案?問題在於https:// www正在提供證書,這使得握手發生在htacces重定向之前。假設我們有辦法在網站的www版本上禁用SSL?這種方式沒有握手和直接執行 –

相關問題