将非www重写为www,将HTTP重写为HTTPS

时间:2016-06-08 22:45:11

标签: apache amazon-web-services dns

我同时具备以下要求:

  • http to https
  • 非www到www

为了处理第一个要求,我有以下Apache配置部分:

ServerName www.example.com
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule !/elbcheck.html https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

X-Forwarded-Proto条件适用于我的AWS负载均衡器,RewriteRule旨在避免在仅处理elbcheck.html文件时重写,因为它是目标AWS负载均衡器的运行状况检查。这是经过测试和运作的(source)。

但是,我很难一直让非www去路由到www。我一度接近,但遇到一个重大问题,https://example.com重新写入https://www.example.com

如何使用http来重复写入https重写,还修复我的非www到www重写?

2 个答案:

答案 0 :(得分:1)

这个问题的解决方案是多方面的。首先,我在ServerFault上找到了一个非常有用的答案:

https://serverfault.com/a/728957/336268

使用这个,我重写了我的Apache配置,如下所示。请注意,它仍然保留了elbcheck.html避免要求。

RewriteEngine On

# Ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule !/elbcheck.html https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule !/elbcheck.html https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

在执行此操作并重新启动Apache之后,我立即注意到重定向从问题https://example.com开始起作用

但是,出现了一个新问题。浏览器开始抱怨安全证书无效。多一点研究,我很幸运地找到了这篇文章:

http://www.jasonsamuel.com/2011/03/07/how-to-properly-use-ssl-redirects-without-getting-certificate-error-messages/

该文章基本上说,有问题的重定向https://example.com无法单独通过移民来解决,并且需要在证书级别提供相互支持。我的通配符证书没有涵盖“apex域”案例,因此导致浏览器抱怨证书的有效性。

幸运的是,对我而言,由于我使用的是亚马逊网络服务,修复证书问题非常容易。我刚刚从ACM申请了一个包含顶点和通配符的新证书。我在我的AWS负载均衡器上安装了证书,现在问题解决了。

答案 1 :(得分:0)

您可以使用

   RewriteEngine On
   RewriteCond %{HTTP:X-Forwarded-Proto} !https
   RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
   RewriteRule ^/elbcheck\.html$ - [L]
   RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI}   [R=301,L]