Como redirect todas as solicitações HTTP para HTTPS

Estou tentando redirect todas as solicitações HTTP inseguras em meu site (por exemplo, http://www.example.com ) para HTTPS ( https://www.example.com ). Eu estou usando PHP btw. Posso fazer isso no .htaccess?

Atualização: Embora esta resposta tenha sido aceita há alguns anos, observe que sua abordagem agora é recomendada pela documentação do Apache. Use um Redirect vez disso. Veja esta resposta .


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

Fonte

Os documentos do Apache recomendam não usar uma reescrita:

Para redirect URLs http para https , faça o seguinte:

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

Esse snippet deve entrar no arquivo de configuração do servidor principal, e não no .htaccess conforme solicitado na pergunta.

Este artigo pode ter surgido somente após a pergunta ser feita e respondida, mas parece ser o caminho a seguir.

Eu recomendo com redirecionamento 301:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Como eu estava dizendo nesta pergunta , sugiro que você evite redirect cegamente todas as solicitações HTTP para seu equivalente HTTPS, pois isso pode causar uma falsa impressão de segurança. Em vez disso, você provavelmente deve redirect a “raiz” do seu site HTTP para a raiz do seu site HTTPS e vinculá-lo, apenas para HTTPS.

O problema é que, se algum link ou formulário no site HTTPS fizer o cliente enviar uma solicitação ao site HTTP, seu conteúdo ficará visível antes do redirecionamento.

Por exemplo, se uma das suas páginas veiculadas por HTTPS tiver um formulário que diga

e enviar alguns dados que não devem ser enviados claramente, o navegador primeiro enviará a solicitação completa (incluindo a entidade, se for um POST) para o site HTTP primeiro. O redirecionamento será enviado imediatamente para o navegador e, como um grande número de usuários desativa ou ignora os avisos, é provável que ele seja ignorado.

Naturalmente, o erro de fornecer os links que deveriam ser para o site HTTPS, mas que acabam sendo para o site HTTP, pode causar problemas assim que você conseguir algo escutando na porta HTTP no mesmo endereço IP do seu site HTTPS. No entanto, acho que manter os dois sites como um “espelho” só aumenta as chances de cometer erros, já que você tende a supor que ele se corrigirá automaticamente ao redirect o usuário para HTTPS, embora muitas vezes seja tarde demais. (Houve discussões semelhantes nesta questão. )

Eu descobri que a melhor maneira de https e www no domínio é

 RewriteCond %{HTTPS} off RewriteCond %{HTTPS_HOST} !^www.cheapcarhire.gr$ [NC] RewriteRule ^(.*)$ https://www.cheapcarhire.gr/$1 [L,R=301] 

Esta é a abordagem de redirecionamento de html que funciona, mas não é a melhor.

   

Abordagem PHP

  

.htaccess approch

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

copiado de: http://www.letuslook.org

Eu gosto deste método de redirecionamento de http para https. Porque não preciso editá-lo para cada site.

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 

Usar o seguinte código no seu arquivo .htaccess redireciona automaticamente os visitantes para a versão HTTPS do seu site:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Se você tiver um arquivo .htaccess existente:

Não duplique RewriteEngine On.

Certifique-se de que as linhas que começam com RewriteCond e RewriteRule sigam imediatamente o RewriteEngine On já existente.

Adicione o seguinte código ao arquivo .htaccess:

 Options +SymLinksIfOwnerMatch RewriteEngine On RewriteCond %{SERVER_PORT} !=443 RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L] 

Onde [seu nome de domínio] é o nome de domínio do seu site.

Você também pode redirect pastas específicas para fora do seu nome de domínio, substituindo a última linha do código acima por:

 RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L] 

Este é o método apropriado de redirect o HTTP para HTTPS usando o .htaccess de acordo com o GoDaddy.com. A primeira linha de código é autoexplicativa. A segunda linha de código verifica se o HTTPS está desativado e, nesse caso, ele redireciona o HTTP para HTTPS executando a terceira linha de código, caso contrário, a terceira linha de código será ignorada.

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828

A melhor solução depende dos seus requisitos. Este é um resumo das respostas publicadas anteriormente com algum contexto adicionado.

Se você trabalha com o servidor web Apache e pode alterar sua configuração, siga a documentação do Apache :

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

Mas você também perguntou se você pode fazer isso em um arquivo .htaccess . Nesse caso, você pode usar o RewriteEngine do Apache:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L] 

Se tudo estiver funcionando bem e você quiser que os navegadores se lembrem desse redirecionamento, você pode declará-lo como permanente alterando a última linha para:

 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Mas tenha cuidado se você pode mudar de idéia sobre esse redirecionamento. Os navegadores lembram-se disso por muito tempo e não verificam se ele mudou.

Você pode não precisar da primeira linha RewriteEngine On dependendo da configuração do servidor web.

Se você procurar uma solução PHP, veja a matriz $ _SERVER e a function de header :

 if (!$_SERVER['HTTPS']) { header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); } 

Faça tudo o que é explicado acima para redirecionamento. Basta adicionar “HTTP Strict Transport Security” ao seu header. Isso evitará o homem no ataque do meio.

Edite seu arquivo de configuração do apache (/etc/apache2/sites-enabled/website.conf e /etc/apache2/httpd.conf por exemplo) e adicione o seguinte ao seu VirtualHost:

 # Optionally load the headers module: LoadModule headers_module modules/mod_headers.so  Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"  

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security

Para redirect todas as solicitações de http para https , você pode usar:

 RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R] 

Se a mod-rewrite não estiver ativada e você estiver no apache 2.4, você também pode usar uma diretiva Redirect inside if para redirect solicitações http para https .

Apache 2.4.

  Redirect / https://www.example.com/  

Através do .htaccess Isso ajudará.

 RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] 

Além disso, consulte isto para mais detalhes. Como redirect Http para Https?

A menos que você precise do mod_rewrite para outras coisas, usar a diretiva IF core do Apache é mais limpa e rápida:

  Redirect permanent / https://yoursite.com/  

Você pode adicionar mais condições à diretiva IF, como garantir um único domínio canônico sem o prefixo www:

  Redirect permanent / https://myonetruesite.com/  

Há muita inércia de familiaridade em usar mod_rewrite para tudo, mas veja se isso funciona para você.

Mais informações: https://httpd.apache.org/docs/2.4/mod/core.html#if

Para vê-lo em ação (tente sem www. Ou https: //, ou com .net em vez de .com): https://nohodental.com/ (um site em que estou trabalhando).

Se você está em uma situação onde você não pode acessar a configuração do apache diretamente para o seu site, que muitas plataformas hospedadas ainda são restritas desta forma, então eu realmente recomendaria uma abordagem de duas etapas. A razão pela qual o próprio Apache documentou que você deve usar suas opções de configuração acima de tudo sobre o mod_rewrite para HTTP para HTTPS.

Primeiro, como mencionado acima, você configuraria suas regras .htaccess mod_rewrite:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Então, em seu (s) arquivo (s) PHP (você precisa fazer isso sempre que for apropriado para sua situação, alguns sites irão canalizar todas as solicitações através de um único arquivo PHP, outros servem várias páginas dependendo de suas necessidades e da solicitação sendo feita ):

  

O acima precisa ser executado ANTES de qualquer código que possa expor dados seguros em um ambiente inseguro. Assim, seu site usa o redirecionamento automático via HTACCESS e mod_rewrite, enquanto seu (s) script (s) garantem que nenhuma saída seja fornecida quando não acessada por HTTPS.

Eu acho que a maioria das pessoas não pensa assim e, portanto, o Apache recomenda que você não use esse método sempre que possível. No entanto, basta uma verificação extra no final do desenvolvimento para garantir que os dados do usuário estejam seguros. Espero que isso ajude alguém que possa ter de usar methods não recomendados devido a restrições no final de nossos serviços de hospedagem.

Se você estiver usando o Apache, o mod_rewrite é a solução mais fácil, e tem muita documentação on-line sobre como fazer isso. Por exemplo: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

Uma vantagem diferente para esse problema é quando um Load Balancer entra em ação.

A situação é a seguinte: – O tráfego do navegador para o Load Balancer e vice-versa é (deve ser) HTTPS – O tráfego entre o Load Balancer e o WebServer real é HTTP.

Então, todas as variables ​​de requisição do servidor em PHP ou Apache mostram que a conexão é apenas HTTP. E os diretórios HTTP e HTTPS no servidor são os mesmos.

O RewriteCondition na resposta aprovada não funciona. Ele dá um loop ou simplesmente não funciona.

A pergunta é: como fazer isso funcionar em um balanceador de carga.

(Ou o Balanceador de Carga está configurado errado? Qual é o que eu estou esperando porque então eu posso mover o problema para a empresa WebHosting :-))

Eu encontrei um método para forçar todas as páginas do meu site redirect de http para analógico de páginas em https que funcionam para mim.

 RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Se você estiver usando um Elastic Load Balancer da Amazon Web Services que aceite tráfego https e o direcione para seu (s) servidor (es) com http, a maneira correta de redirect todo o tráfego http para https é descrita aqui: https: //aws.amazon. com / premiumsupport / centro de conhecimento / redirect-http-https-elb

Use o header X-Forwarded-Proto (contém http ou https) que é sempre incluído nas solicitações http do balanceador de carga, conforme descrito aqui: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x- encaminhados-headers.html

No arquivo httpd.conf:

  RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]  

Ou no seu arquivo root .htaccess:

 RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent] 

Bônus: ele não tentará redirect o tráfego HTTP em sua máquina de desenvolvimento local.