我同时具备以下要求:
为了处理第一个要求,我有以下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重写?
答案 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开始起作用
但是,出现了一个新问题。浏览器开始抱怨安全证书无效。多一点研究,我很幸运地找到了这篇文章:
该文章基本上说,有问题的重定向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]