如何从https子域URL中删除www

时间:2017-04-03 11:48:07

标签: apache .htaccess ssl mod-rewrite elastic-load-balancer

我有一个通过弹性负载均衡器(ELB)在AWS上设置的域。要启用SSL,我已将AWS托管安全证书(* .domain.us)添加到负载均衡器。我需要能够安全地访问以下8个URL组合:

[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证书是通配符证书,并且不能仅用于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]工作。我仍然在浏览器中收到“连接不安全”错误。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这是一个非常常见的'问题',或者更确切地说是设计的。您在浏览器中显式调用HTTPS,因此在交换任何数据之前建立HTTPS连接。但是当你的证书没有涵盖时,它注定会失败

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

您必须在处理SSL- / TLS-Offloading的组件中实现逻辑,首先更改为http或正确的HTTP_HOST BEFORE 建立SSL连接。

所以你要走的路是:

请勿使用显式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} NOT 包含%{QUERY_STRING}。因此,重写时总是会删除查询字符串。