我试图在AWS EC2实例上强制使用.htaccess中的非www + https。
虽然StackOverflow上有大量明显可行的解决方案,但所有这些解决方案都只为我生成重定向循环。
当我尝试这条规则时,我得到一个重定向循环:
RewriteEngine on
#RewriteCond %{HTTP_HOST} ^(www\.)(.+) [OR]
#RewriteCond %{HTTPS} off
#RewriteCond %{HTTP_HOST} ^(www\.)?(.+)
#RewriteRule ^ https://%2%{REQUEST_URI} [R=301,L]
(通过Force non-www and https via htaccess)
这个相同:
RewriteEngine on
#RewriteCond %{HTTP_HOST} !^domain.com$ [NC]
#RewriteRule ^(.*)$ https://domain.com/$1 [L,R=301]
#RewriteCond %{HTTPS} off
#RewriteRule ^(.*)$ https://domain.com/$1 [R,L]
两者似乎都适用于相应的OP,并且如某些评论所示,它们也适用于其他人。
我在httpd.conf
:
NameVirtualHost *:80
Listen 8443
NameVirtualHost *:8443
<VirtualHost *:80 *:8443>
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/domain.com
ServerName domain.com
ServerAlias *.domain.com
ErrorLog logs/domain.com-error_log
CustomLog logs/domain.com-access_log common
</VirtualHost>
对于上下文::8443端口从AWS ELB(负载均衡器)接收流量,该流量:443 SSL请求到此特定端口,因为SSL证书安装在负载均衡器本身上。
重定向循环可能是什么问题?
答案 0 :(得分:1)
在负载均衡器后面,你必须以不同的方式处理事情。由于您的LB使用SSL卸载,因此您不会以正常方式检查https
。您需要查看X-Forwarded-Proto
尝试这些规则并了解它们的工作原理。
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{SERVER_NAME} ^(www\.)?(.*)$ [NC]
RewriteRule ^.*$ https://%2%{REQUEST_URI} [R=301,L]
答案 1 :(得分:1)
要避免重定向循环,您可以使用此规则:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\. [NC,OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L,NE]
确保在测试之前清除浏览器缓存。