我在使用Phalcon PHP制作的网站中配置了HTTPS。现在我想将对HTTP的任何请求重定向到HTTPS。服务器是AWS EC2,带有负载均衡器。
Phalcon PHP有两个.htaccess文件:
/ .htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</IfModule>
/ public .htaccess
AddDefaultCharset UTF-8
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>
我已按照this post上的说明将此添加到这些文件中,并获得了ERR_TOO_MANY_REDIRECTS。
# force HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
你能帮我弄清楚我在这里做错了什么吗? 谢谢你的帮助。
更新: 我想这是来自AWS的负载均衡器的问题。这是我的配置:带有负载均衡器的EC2实例(使用SSL证书),然后在我的Route53中指向此负载均衡器。我在this post中尝试了答案,但仍无效。
答案 0 :(得分:1)
HTTPS重定向或任何其他重定向应该在.htaccess文件中的Phalcon规则之前。
这是 root 文件夹中的.htaccess文件:
<IfModule mod_rewrite.c>
RewriteEngine On
# Force HTTPS
RewriteCond %{HTTPS} off
RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Force www
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Forward to /public/ folder
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
答案 1 :(得分:1)
Nikolay的回答是正确的,但问题还是其他问题:AWS Load Balancer的问题。所以,这是我目前的根.htaccess:
<IfModule mod_rewrite.c>
RewriteEngine on
#solves the problem with load balancer
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^$ https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</IfModule>
亚马逊的文章here。