Precisa redirect todo o tráfego para https

Quero redirect qualquer tráfego que vá para http://example.com para https://example.com

mesmo para http://example.com/about para https://example.com/about

Eu pensei que seria algo assim:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteRule ^(.*)$ https://example.com/$1 [R=301,L] 

Isso funciona para mim:

 RewriteEngine on RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

Se o tráfego estiver chegando por HTTP não SSL, redirecione para o equivalente HTTP da página que o usuário estava tentando acessar originalmente. Também não envolve quaisquer opções de mod_rewrite, por isso é fácil de ler.

Side rant: por que todos sentem a necessidade de definir explicitamente o código HTTP do redirecionamento e marcar uma de suas reescritas como a “última”? Sério, eu vi dezenas de regras de htaccess de aparência semelhante nos últimos dias.

Esta é uma resposta anterior usando .httaccess mas adicionando mudanças propostas nos comentários, e algumas de mim:

 RewriteEngine on RewriteBase / RewriteCond %{HTTPS} !on RewriteRule (.*) https://my.domain.name%{REQUEST_URI} [L,R=301] 

Notas:

  • Isto é para os casos em que o usuário não tem access à configuração principal, mas tem access às regras do .htaccess. Se você tiver access à configuração principal, use a solução mod_alias .
  • Para mim, a regra não foi escolhida sem definir RewriteBase. Definindo explicitamente, elimina-se a ambigüidade com algumas configurações do servidor.
  • Pelo menos em algumas configurações, %{HTTPS} não está definido como off ao usar http, mas é nulo, portanto, a regra é mais confiável do que off .
  • Para o nome do host explícito, você não depende do header do Host do lado do cliente nem da configuração do servidor. No entanto, o nome do host explícito assume que existe apenas um domínio para redirect. O header do host apresenta alguns problemas consideráveis, como conter porta e ser dados fornecidos pelo cliente. Outra alternativa, como sugerido pelo Apache Wiki , é usar %{SERVER_NAME} . Se você considerar usá-lo, confira a advertência nesta discussão – ele depende de outras configurações estarem corretas.
  • R=301 significa redirecionamento permanente, como geralmente é feito neste caso. Se você acha que é temporário, isso pode ser deixado de fora ou especificado como R=302 .
  • L significa que é a última regra a ser aplicada para essa solicitação. Deixe-o se você suspeitar ou souber que existem outras regras depois disso que você não quer ser aplicado. Você pode remover se esta for a única regra do arquivo.

De acordo com a documentação do Apache , usar mod_alias é mais apropriado que mod_rewrite para esta tarefa. Ou seja, para redirect todo o tráfego HTTP para HTTPS, seria necessário:

  ServerName www.example.com Redirect permanent / https://www.example.com/   ServerName www.example.com # ... SSL configuration goes here  

Duas coisas para observar sobre essa configuração:

  1. Você precisa acessar o arquivo de configuração principal do servidor para que esta configuração funcione. A diretiva VirtualHost é válida apenas no contexto “config do servidor”.
  2. Tenha em mente que as diretivas mod_rewrite são processadas antes mod_alias diretivas mod_alias . Se você já possui um bloco massivo de RewriteRule s no seu arquivo .htaccess , você pode estar melhor com a configuração mod_rewrite .

porque não apenas simples e simples?

 rewriteCond %{HTTPS} !on rewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L] 

isso funcionou para mim e me parece claro. Felicidades.