Apache 将非www重写为www,将HTTP重写为HTTPS
我同时具备以下两项要求:Apache 将非www重写为www,将HTTP重写为HTTPS,apache,amazon-web-services,dns,Apache,Amazon Web Services,Dns,我同时具备以下两项要求: http到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负
- http到https
- 非www到www
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负载平衡器,重写规则
旨在避免仅在处理elbcheck.html
文件时重新写入,因为它是AWS负载平衡器健康检查的目标。这是经过测试和工作的()
但是,我一直很难让非www路由到www。我曾一度接近www,但在重新写入时遇到了一个重大问题
如何使http到https的重新写入保持正常工作,同时修复非www到www的重新写入?您可以使用
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]
你可以用
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]
这个问题的解决办法是多管齐下的。首先,我在ServerFault上找到了一个非常有用的答案: 使用这个,我重写了我的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之后,我立即注意到重定向开始从有问题的服务器开始工作
但是,出现了一个新问题。浏览器开始抱怨安全证书无效。再做一点研究,我幸运地找到了这篇文章:
这篇文章基本上说,有问题的重定向不能仅通过配置来解决,需要证书级别的相互支持。我的通配符证书没有涵盖“apex域”案例,因此导致浏览器抱怨证书的有效性
幸运的是,对我来说,因为我使用了AmazonWeb服务,所以修复证书问题很容易。我刚刚向ACM申请了一个新的证书,其中包括apex和通配符。我在AWS负载平衡器上安装了证书,现在我的问题已经解决。这个问题的解决方案是多管齐下的。首先,我在ServerFault上找到了一个非常有用的答案: 使用这个,我重写了我的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之后,我立即注意到重定向开始从有问题的服务器开始工作
但是,出现了一个新问题。浏览器开始抱怨安全证书无效。再做一点研究,我幸运地找到了这篇文章:
这篇文章基本上说,有问题的重定向不能仅通过配置来解决,需要证书级别的相互支持。我的通配符证书没有涵盖“apex域”案例,因此导致浏览器抱怨证书的有效性
幸运的是,对我来说,因为我使用了AmazonWeb服务,所以修复证书问题很容易。我刚刚向ACM申请了一个新的证书,其中包括apex和通配符。我在AWS负载平衡器上安装了证书,现在我的问题已经解决。在运行状况检查中将ELB检查更改为TCP协议,将端口80更改为端口80。然后应用这些规则。在运行状况检查中将ELB检查更改为TCP协议,将端口更改为80。然后应用这些规则。我喜欢你的做法,但是当重新启动Apache时,我在最后一行遇到语法错误
RewriteRule:bad flag delimiters Apache config test失败,中止抱歉,我跳过了一行。我已经更新了我的答案。它将解析您的查询。语法正常,但现在http://www.example.com
重写为http://www.www.example.com
。那太糟糕了。不过,谢谢你的帮助!我喜欢您的做法,但在重新启动Apache时,我在最后一行遇到语法错误RewriteRule:bad flag delimiters Apache config test失败,中止抱歉,我跳过了一行。我已经更新了我的答案。它将解析您的查询。语法正常,但现在http://www.example.com
重写为http://www.www.example.com
。那太糟糕了。不过,谢谢你的帮助!我还想指出,我的问题的一大部分首先是无法阅读和理解Apache mod_rewrite。这非常复杂,尤其是当您还需要阅读和理解正则表达式语法时。我发现以下几点有助于我足够熟练地使用配置:我还想指出,我的问题的一大部分首先是无法阅读和理解Apache mod_rewrite。这非常复杂,尤其是当您还需要阅读和理解正则表达式语法时。我发现以下内容有助于我熟练掌握配置,从而帮助我的配置正常工作: