为什么.htaccess重写规则在其他地方完全正常工作会产生重定向循环?

时间:2015-06-18 19:44:00

标签: .htaccess mod-rewrite amazon-web-services

我试图在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

中设置了以下VirtualHosts
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证书安装在负载均衡器本身上。

重定向循环可能是什么问题?

2 个答案:

答案 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]

确保在测试之前清除浏览器缓存。