Estou usando o seguinte para forçar o HTTPS no meu site principal.
### Force SSL
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Se você quiser ver o arquivo htaccess completo, coloquei abaixo:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
### Blacklist via Referrers
RewriteCond %{HTTP_REFERER} removed\.net [NC,OR]
RewriteCond %{HTTP_REFERER} removed\.com [NC,OR]
RewriteCond %{HTTP_REFERER} removed\.removed\.com [NC,OR]
RewriteCond %{HTTP_REFERER} removed\.com [NC,OR]
RewriteCond %{HTTP_REFERER} removed\.net [NC,OR]
RewriteCond %{HTTP_REFERER} removed\.sx [NC,OR]
RewriteCond %{HTTP_REFERER} removed\.com [NC,OR]
RewriteCond %{HTTP_REFERER} removed\.com [NC,OR]
RewriteCond %{HTTP_REFERER} removed\.com [NC,OR]
RewriteCond %{HTTP_REFERER} removed\.com [NC,OR]
RewriteCond %{HTTP_REFERER} removed\.org [NC]
RewriteRule ^(.*)$ - [F,L]
### Force SSL
#RewriteCond %{HTTPS} !=on
#RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
### Canonicalize codeigniter URLs
# If your default controller is something other than
# "welcome" you should probably change this
RewriteRule ^(welcome(/index)?|index(\.php)?)/?$ / [L,R=301]
RewriteRule ^(.*)/index/?$ $1 [L,R=301]
# Removes trailing slashes (prevents SEO duplicate content issues)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ $1 [L,R=301]
# Enforce NO www
RewriteCond %{HTTP_HOST} ^www [NC]
RewriteRule ^(.*)$ https://removed.com/$1 [L,R=301]
# Removes access to the system folder by users.
# Additionally this will allow you to create a System.php controller,
# previously this would not have been possible.
# 'system' can be replaced if you have renamed your system folder.
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php/$1 [L]
# Checks to see if the user is attempting to access a valid file,
# such as an image or css document, if this isn't true it sends the
# request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
<IfModule !mod_rewrite.c>
# Without mod_rewrite, route 404's to the front controller
ErrorDocument 404 /index.php
</IfModule>
Estou lutando para descobrir como o loop de redirecionamento está acontecendo.
Atualizar
Não deixei claro que meu servidor web (Apache) está configurado apenas com um host virtual na porta 80 que recebe o tráfego HTTP e HTTPS direcionado a ele pelo balanceador de carga. O balanceador de carga lida com a conexão SSL.
Graças ao comentário de HBruijn , entendi porque estava recebendo o loop de redirecionamento.
O tráfego do ELB sempre será HTTP, pois ele lida com o tráfego HTTPS para o usuário, mas para o servidor é HTTP, então minha regra anterior resultará em um loop.
Após algumas pesquisas, descobri que o balanceador de carga encaminha alguns cabeçalhos úteis como
X-Forwarded-Proto
. Isso pode ser usado para determinar se o cliente está usando HTTP ou HTTPS da seguinte forma:Espero que o que foi dito acima ajude alguém ao tentar forçar o HTTPS por trás do balanceador de carga do Amazon Web Services.
Em vez de fazer isso em um
.htaccess
arquivo, simplesmente defina o SSL Redirect na entrada não-SSL VirtualHost de sua configuração do Apache:que é muito mais eficiente.
Além disso: minha implicância, citada no manual sobre arquivos .htaccess: