2017-04-03 101 views
0

我有一個通過彈性負載平衡器(ELB)在AWS上設置的域。要啓用SSL,我已將AWS託管安全證書(* .domain.us)添加到負載均衡器。我需要能夠訪問以下8個網址安全組合:如何從https子域中刪除www

[1] http://www.domain.us 
[2] http://www.subdomain.domain.us 
[3] http://domain.us 
[4] http://subdomain.domain.us 
[5] https://www.domain.us 
[6] https://www.subdomain.domain.us 
[7] https://domain.us 
[8] https://subdomain.domain.us 

所蘊含通配符AWS證書,1,4,5,和8個自動爲我工作。但對於剩餘的URL類型,我更新了我的.htaccess文件,如下所示: (如果我只是訪問[7]而沒有將其轉換爲www.domain.us,我得到一個「連接不安全」的錯誤,因爲我的AWS證書是wildcard one,並且僅在https:// 域名 .us中無效https:// www .domain.us或https:// 子域名 .domain.us由於通配符證書正常工作)

RewriteEngine On 

# domain.us => www.domain.us ------------------------------------------- 
RewriteCond %{HTTP_HOST} ^domain.us 
RewriteRule^http://www.domain.us%{REQUEST_URI} [R=301,L] 

RewriteCond %{HTTPS} =on 
RewriteCond %{HTTP_HOST} ^domain.us 
RewriteRule^https://www.domain.us%{REQUEST_URI} [R=301,L] 

# www.subdomain.domain.us => subdomain.domain.us ----------------------- 
RewriteCond %{HTTP_HOST} ^www\.([^.]+\.domain\.us)$ [NC] 
RewriteRule^http://%1%{REQUEST_URI} [R=301,QSA,NC,L] 

# NO WWW http://www. becomes always http:// 
RewriteCond %{HTTPS} =on 
RewriteCond %{HTTP_HOST} ^www\.(.+\.domain\.us)$ [NC] 
RewriteRule ^(.*)$ https://%1/$1 [R=301,L] 

# http => https ------------------------------------------------------------ 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteCond %{HTTPS} off 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] 

# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 

# END WordPress 

<Files 403.shtml> 
order allow,deny 
allow from all 
</Files> 

我正在偵聽ELB上的端口80和443,並將每個端口的相應數據發送到實例端口。我在EC2實例上打開了80和443端口。

我已經經歷了許多SO帖子,並創建了上面的.htaccess文件,但是我仍然無法獲得。 [6]和[7]工作。瀏覽器中仍然出現「連接不安全」錯誤。任何人都可以幫忙嗎?

+0

如果您的證書不包含'domain.us',那麼您不能重寫'https:// domain.us'的請求,因爲它永遠不會到達那麼遠。 – CBroe

回答

0

這是一個很常見的問題,或者更確切地說是按照設計工作。您正在顯式調用瀏覽器中的HTTPS,以便在交換任何數據之前建立HTTPS連接。但是,就註定當您的證書不包括

[6] https://www.subdomain.domain.us 
[7] https://domain.us 

你必須實現在SSL-/ TLS-卸載的處理,首先改變http或正確HTTP_HOST在組件邏輯失敗之前 SSL連接建立。

所以你要走的路是:

Dont't通話網址具有明確HTTPS! :)

讓服務器執行此操作。和你的服務器配置可以縮短到這一點:

RewriteCond %{HTTP_HOST} !^.+\.domain.us 
RewriteRule^https://www.domain.us%{REQUEST_URI} [R=301,L] 

RewriteCond %{HTTP_HOST} ^www\.(.+\.domain\.us)$ [NC] 
RewriteRule^https://%1%{REQUEST_URI} [R=301,QSA,L] 

RewriteCond %{HTTPS} off 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

注意%{REQUEST_URI}確實包含%{QUERY_STRING}。所以查詢字符串總是會在重寫時丟失。