2017-04-03 95 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}。所以查询字符串总是会在重写时丢失。

相关问题