Como redireccionar todos os pedidos de HTTP para HTTPS

estou a tentar redireccionar todos os pedidos HTTP inseguros no meu site (por exemplo http://www.example.com) para HTTPS (https://www.example.com). Estou a usar o PHP btw. Posso fazer isto dentro ?htaccess?

Author: Kate Gregory, 2010-11-03

20 answers

Update: Embora esta resposta tenha sido aceite há alguns anos, lembre-se que a sua abordagem é agora recomendada contra pela documentação Apache. Utilize um Redirect em vez disso. Veja Esta Resposta .


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

Origem

 245
Author: Reese Moore, 2017-05-23 12:10:46

OApache docs recomenda não usar uma reescrita:

Para redireccionar http URLs para https, Faça o seguinte:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Este excerto deve ir para o ficheiro de configuração do servidor principal, Não para .htaccess como se faz na pergunta.

Este artigo pode ter surgido apenas após a pergunta ter sido feita e respondida, mas parece ser o caminho actual.
 287
Author: ssc, 2018-02-15 22:38:26
Eu recomendaria com o 301 redireccionar:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 117
Author: David, 2014-12-29 23:05:37
Como eu estava dizendo em [[[3]] esta pergunta, eu sugiro que você evite redirecionar todos os pedidos HTTP para seus HTTPS equivalentes cegamente, pois isso pode causar uma falsa impressão de segurança. Em vez disso, você provavelmente deve redirecionar a" raiz " do seu site HTTP para a raiz do seu site HTTPS e link de lá, apenas para HTTPS.

O problema é que se algum link ou formulário no site HTTPS faz com que o cliente envie um pedido para o site HTTP, o seu conteúdo será visível, antes do reorientacao.

Por exemplo, se uma das suas páginas servidas sobre HTTPS tem um formulário que diz {[[0]} e envia alguns dados que não devem ser enviados em claro, o navegador irá primeiro enviar o pedido completo (incluindo entidade, se for um POST) para o site HTTP primeiro. O redirecionamento será enviado imediatamente para o navegador e, uma vez que um grande número de usuários desativam ou ignoram os avisos, é provável que seja ignorado.

É claro, o erro de fornecer as ligações que devem estar aos HTTPS. site, mas que acabam sendo para o site HTTP pode causar problemas assim que você começa algo que escuta na porta HTTP no mesmo endereço IP que o seu site HTTPS. No entanto, eu acho que manter os dois sites como um "espelho" só aumenta as chances de cometer erros, como você pode tender a fazer a suposição de que ele vai auto-corrigir-se, redirecionando o Usuário para HTTPS, enquanto muitas vezes é tarde demais. (Houve discussões semelhantes nesta questão.))
 30
Author: Bruno, 2017-05-23 12:34:51

Descobri que a melhor maneira para 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]
 16
Author: GiorgosK, 2014-10-21 10:42:42
Este é o método de redirecionamento html que funciona, mas não o melhor.
 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

Aproximação do PHP

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess approch

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

Copiado de: www.letuslook.org

 11
Author: Timothy Nwanwene, 2016-04-15 11:27:04
Gosto deste método de redirecionamento de http para https. Porque eu não preciso editá-lo para cada site.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
 9
Author: Cory, 2014-11-21 08:37:25

Este é o método adequado para redirecionar HTTP para HTTPS usando .htaccess de acordo com GoDaddy.com a primeira linha de código é auto-explicativa. A segunda linha de verificação de código para ver se HTTPS está desligado, e se assim for redireciona HTTP para HTTPS executando a terceira linha de código, caso contrário a terceira linha de código é 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

 6
Author: AnarchyOutlaw, 2016-02-22 16:39:09

Usando o seguinte código no seu .o 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 tiver um existente .ficheiro htaccess:

Não duplicar a regravação.

Certifique-se de que as linhas que começam a regravar e a regravar imediatamente seguem a regravação já existente.

 6
Author: OpenWebWar, 2016-07-02 11:26:03

Adicione o seguinte código ao .ficheiro htaccess:

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

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

Você também pode redireccionar pastas específicas 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]
 5
Author: Rahul, 2014-09-28 15:44:39

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

Se trabalhar com o servidor web Apache e puder alterar a sua configuração, siga a documentação Apache:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

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

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
Se tudo estiver a funcionar bem e quiser que os navegadores se lembrem deste redireccionamento, pode declare-o permanente, alterando a última linha para:
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Mas tenha cuidado se mudar de ideias sobre este redireccionamento. Os navegadores lembram-se dele por muito tempo e não vão verificar se mudou.

Pode não precisar da primeira linha RewriteEngine On, dependendo da configuração do servidor web.

Se procurar por uma solução de PHP, veja o $_SERVER array e a função do cabeçalho :

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); 
} 
 5
Author: maikel, 2016-09-11 09:14:47

Faça tudo o que é explicado acima para redirecionamento. Basta adicionar "segurança de transporte restrita HTTP" ao seu cabeçalho. Isto evitará o homem no ataque do meio.

Edite o seu ficheiro de configuração apache (/etc/apache2/sites-actived / 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

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

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

 4
Author: Waqas, 2015-08-21 22:23:39

Para redireccionar todos os pedidos http para https, pode usar:

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

Se o mod-reescrever não estiver activo e você estiver no apache 2 .4, também pode usar uma directiva Redirect no interior if para redireccionar os pedidos http para https.

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
 2
Author: starkeen, 2016-07-02 13:46:39
Até lá .htaccess isto vai 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]

Também, consulte isto para mais detalhes. Como Redireccionar Http Para Https?

 2
Author: Roshan Padole, 2016-12-17 09:51:12

A menos que precise de mod_ reescrever para outras coisas, usando o núcleo do Apache se a Directiva for mais limpa e mais rápida:

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

Pode adicionar mais Condições à Directiva FI, tais como assegurar um único domínio canónico sem o prefixo www:

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

Há muita inércia de familiaridade em usar mod_ reescrever para tudo, mas veja se isto funciona para si.

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

Vê-lo em acção (tenta sem www. ou https://, ou com .NET em vez de. com): https://nohodental.com/ (um site em que estou a trabalhar).

 2
Author: SashaK, 2017-02-06 21:53:55

Se você está em uma situação em que você não pode acessar a configuração apache diretamente para o seu site, que muitas plataformas hospedadas ainda são restritas desta forma, então eu realmente recomendo uma abordagem de dois passos. A razão pela qual o próprio Apache documenta que você deve usar as suas opções de configuração em primeiro lugar e acima de tudo sobre o mod_ reescrever para HTTP para HTTPS.

Primeiro, como mencionado acima, você iria configurar o seu .Regra(s) do mod_ reescrito do htaccess:

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

Então, no seu Php file (s) (você precisa fazer isso sempre que for apropriado para a sua situação, alguns sites Irão canalizar todos os pedidos através de um único arquivo PHP, outros servem várias páginas dependendo de suas necessidades e do pedido que está sendo feito):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

O acima deve ser executado antes de qualquer código que possa potencialmente expor dados seguros num ambiente inseguro. Assim, o seu site usa redirecionamento automático via HTACCESS e mod_ reescrita, enquanto o seu script (s) garante que não é fornecida nenhuma saída quando não acedido através dos HTTPS.

Acho que a maioria das pessoas não pensa assim, e assim o Apache recomenda que você não use este método sempre que possível. No entanto, é preciso apenas uma verificação extra sobre o fim do desenvolvimento para garantir que os dados do seu usuário são seguros. Esperemos que isso ajude alguém que pode ter que olhar para o uso de métodos não recomendados devido às restrições em nossos serviços de hospedagem terminar.

 2
Author: F. Scott Gale, 2017-10-28 15:00:39

Eu encontrei um método para forçar todas as páginas do meu site redirecionar 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]
 1
Author: Oleg Apanovich, 2018-07-03 20:36:43

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

 0
Author: vcsjones, 2010-11-03 00:16:12
Uma borda diferente para este problema é quando um Balanceiro de carga entra em jogo.

A situação é a seguinte:: - Tráfego do navegador para carregar Balancer, e de volta, é (deve ser) HTTPS - O tráfego entre o Balancer de carga e o servidor Web actual é HTTP.

Assim, todas as variáveis de pedido do servidor em PHP ou Apache mostram que a ligação é apenas HTTP. E os diretórios HTTP e HTTPS no servidor são os mesmos.

A condição de reescrita na resposta aprovada não funciona. Dá um loop ou simplesmente não funciona.

A questão é: como fazer isto funcionar num Balanceiro de carga.

(ou o Balanceiro de carga está configurado de forma errada. Que é o que eu estou esperando porque então eu posso mover o problema para a empresa WebHosting: -)

 0
Author: BertC, 2015-09-26 11:30:46

Se estiver a usar um Balancer elástico de carga de Serviços Web da Amazon que aceita o tráfego de https e o encaminha para o(s) Seu (s) servidor (s) com http, a forma correcta de redireccionar todo o tráfego http para https está descrita aqui: https://aws.amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb

Use o cabeçalho X-Forwarded-Proto (contém http ou https) que está sempre incluído nos pedidos http do balancer de carga, como descrito aqui: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html

Na Polícia de httpd.ficheiro conf:

<VirtualHost *:80>

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

</VirtualHost>
Ou na tua raiz .ficheiro htaccess:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
Bônus: ele não vai tentar redirecionar o tráfego http em sua máquina de desenvolvimento local.
 0
Author: ScottyB, 2018-07-06 22:31:52