Como redirecionar todas as solicitações HTTP para HTTPS

294

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

Gato
fonte
1
Você pode (e deve) fazer isso através do seu httpd, não do PHP.
drudge
2
@jnpcl, embora eu concorde que a solução httpd é melhor que a solução baseada em PHP, não acho que um redirecionamento sistemático seja uma boa prática em geral. Se você deseja redirecionar seus usuários para HTTPS o tempo todo, envie-os para lá a partir do "ponto de entrada" (o primeiro link para seu site), não faça isso no meio do caminho, o que pode vazar alguns dados que você pensaria está protegido (se você não perceber esse redirecionamento instantâneo).
Bruno
@Bruno: Eu estava pensando mais ao longo das linhas de duplicada http solicitações, o potencial de seqüências de consulta perdidos, ea possibilidade do usuário digitar manualmentehttp://
Drudge
@ jnpcl esse é realmente um bom ponto. Eu estava apenas sugerindo que, embora as pessoas tendam a solicitar esse tipo de redirecionamento para melhorar a segurança do site, muitas vezes ele não o melhora (pois não impede que a mesma solicitação passe primeiro pelo HTTP simples) .
Bruno
8
@outis: o primeiro link que você postou é esta questão.
Mei

Respostas:

305

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


RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Reese Moore
fonte
24
@ Cat, como eu estava dizendo na minha resposta / comentários, se você está tentando "redirecionar todo HTTP inseguro [...] para HTTPS", essa abordagem não torna essas solicitações seguras, apenas o navegador as faz. duas vezes, uma vez insegura e uma vez segura.
Bruno
13
O que você realmente deveria fazer é usar o HSTS em conjunto com isso.
Reese Moore
3
Isso pode ser um bug na minha versão do apache (2.4.6, conforme empacotado no Centos 7), mas isso tem problemas para mim em determinadas URLs. Por exemplo, os http://server/foo?email=someone%40example.comredirecionamentos para, https://server/foo?email=someone%2540example.comou seja, o sinal "@" são citados por URL duas vezes . O uso do método na resposta da @ ssc não possui esse problema.
Psmears
2
Resposta errada. Ele redirecionará apenas o URL base, não os URLs nas subpastas. RewriteRule https: //% {HTTP_HOST} {% REQUEST_URI} [R = 301, L] é a resposta correcta (*.)
FredTheWebGuy
7
Eles não necessariamente o recomendam:In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
Adam
338

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

Para redirecionar httpURLs 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 trecho deve ir em arquivo de configuração do servidor principal, não em .htaccesscomo solicitado na pergunta.

Este artigo pode ter surgido somente depois que a pergunta foi feita e respondida, mas parece ser o caminho atual.

ssc
fonte
11
Essa deve ser a resposta atual. Mas o que exatamente acontece na "configuração SSL"? Um exemplo completo seria realmente útil.
Ben
6
@ Ben: essa é uma questão diferente, amplamente documentada online; aliás, eu adicionei um exemplo quase cheia ontem: serverfault.com/q/597012/26210 que pode lhe dar uma idéia do que se passa na configuração SSL
SSC
46
Essa é uma ótima dica. Mas no documento Apache também menciona: "No caso do redirecionamento http para https, o uso de RewriteRule seria apropriado se você não tiver acesso ao arquivo de configuração principal do servidor e for obrigado a executar esta tarefa em um arquivo .htaccess. " Que é o caso para mim ...
peter_the_oak
4
@ user1844933 Se você usar a permanentpalavra - chave, o efeito será o mesmo (o navegador receberá um redirecionamento 301). Por exemplo:Redirect permanent "/" "https://example.com"
BeetleJuice
2
@Whitecat No Centos 6, o arquivo está localizado em
/etc/httpd/conf/httpd.conf
141

Eu recomendo com o redirecionamento 301:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
David
fonte
7
obrigado, isso funciona para mim, a resposta aceita não .. provavelmente devido à falta de[L]
billynoah
1
Sim. Esta é a resposta correta, uma vez que também as rotas de todas as URLs em subpastas, também
FredTheWebGuy
Isso está no nível superior do arquivo htaccess?
CodyBugstein #
1
@CodyBugstein É onde eu sempre coloco, e sempre funciona.
Daan van den Bergh
3
Todas as respostas não têm uma coisa - qualquer código para redirecionamento deve ser colocado logo no início do seu arquivo .htaccess, ANTES de qualquer outra coisa, se você quiser que todas as páginas sejam redirecionadas para https.
Vadim Anisimov 30/10
35

Como eu estava dizendo nesta pergunta , sugiro que você evite redirecionar todas as solicitações HTTP para seus equivalentes HTTPS às cegas, 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 site HTTPS e vincular a partir daí, apenas para HTTPS.

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

Por exemplo, se uma de suas páginas veiculadas em HTTPS tiver um formulário que diga <form action="http://example.com/doSomething">e envie alguns dados que não devem ser enviados de forma clara, 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 ao navegador e, como um grande número de usuários desabilita ou ignora os avisos, é provável que seja ignorado.

Obviamente, 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ê ouvir algo 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, pois você pode supor que ele se auto-corrigirá redirecionando o usuário para HTTPS, embora muitas vezes seja tarde demais. (Houve discussões semelhantes nesta pergunta. )

Bruno
fonte
1
Ao tomar a decisão de veicular um site inteiro como HTTPS, esse tipo de redirecionamento faz sentido. Não quero que um usuário obtenha um 403 porque especificou http para sua página de destino. Concordo que alguém especifique http em um link e implante-o na produção que é ruim. DEVE ser capturado durante o teste, mesmo com o redirecionamento no lugar. Eu não gosto do argumento "could" porque isso "poderia" acontecer sem o redirecionamento. Os sintomas são os mesmos quando o teste em um navegador seguro, a não ser depois de confirmar para enviar em claro ele redireciona em vez de receber um 403.
Derek Litz
Sim, vejo o benefício de falhar bastante se alguém colocar o HTTP por engano em uma ação de formulário, mas ser tolerante com URLs digitados parece mais importante na maioria dos casos.
Daniel Lubarov
4
@ Daniel, eu concordo que é útil ser indulgente quando os usuários digitam o URL. Eu diria que é um dos casos em que é melhor desativar esse recurso durante o desenvolvimento / teste, mas ativá-lo na produção (ou nos últimos estágios do desenvolvimento / teste).
Bruno
por que não fazer o http para https no dns.
Muhammad Umer
1
@ MuhammadUmer, porque isso não tem nada a ver com o DNS. Eles usariam o mesmo nome de host em geral, mas mesmo com um nome de host diferente, você ainda precisaria alterar o protocolo e a porta.
Bruno
18

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

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
GiorgosK
fonte
Isso não será redirecionado http://www.example.com/...porque as duas condições estão implicitamente AND. Eles deveriam ser OR'd, ou seja. inclua a ORflag na primeira condição (e lembre-se de escapar dos pontos literais na regex). Mas se você estiver implementando HSTS então você não quer redirecionar para HTTPS e www em um único redirecionamento, você deve redirecionar para HTTPS primeiro .
MrWhite
Onde coloco este texto?
Aaron Franke
Sobre o tipo semelhante de pergunta. Alguém pode ajudar com a pergunta abaixo? stackoverflow.com/questions/59503217/…
appsntech
14

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

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

Abordagem 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

Timothy Nwanwene
fonte
Para onde .htaccessvai? Além disso, esse link está morto.
Aaron Franke
8

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]
Cory
fonte
Onde coloco este texto?
Aaron Franke
6

O uso do código a seguir no 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ê possui um arquivo .htaccess:

Não duplique RewriteEngine On.

Verifique se as linhas que começam RewriteCond e RewriteRule seguem imediatamente o RewriteEngine já existente ativado.

OpenWebWar
fonte
O que L e R significam?
Aaron Franke
5

Esse é o método adequado para redirecionar HTTP para HTTPS usando .htaccess, de acordo com o GoDaddy.com. A primeira linha de código é auto-explicativa. A segunda linha de código verifica se o HTTPS está desativado e, se estiver, redireciona o HTTP para o 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

AnarchyOutlaw
fonte
5

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

Se você trabalha com o servidor da web Apache e pode alterar sua configuração, siga a documentação do 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 pode fazê-lo em um .htaccessarquivo. 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ê desejar que os navegadores se lembrem desse redirecionamento, você pode declarar como permanente alterando a última linha para:

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

Mas tome cuidado se você mudar de idéia nesse redirecionamento. Os navegadores lembram-no por muito tempo e não verificam se foi alterado.

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

Se você procurar uma solução PHP, observe a matriz $ _SERVER e a função do cabeçalho :

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); 
} 
maikel
fonte
Parece que a documentação do Apache recomenda contra a rota Rewrite. E o Redirect? O que mais pode ir em um .htaccessarquivo?
precisa saber é o seguinte
Sim, o redirecionamento é preferido e pode ser usado no .htaccess. Mas você não pode adicionar a condição para redirecionar apenas o tráfego http para https. Ele também redireciona https -> loop de redirecionamento infinito. Eu o listei na diretiva VirtualHost usada para http (porta 80) acima. O htaccess não suporta essa diretiva e, portanto, o redirecionamento não pode ser usado aqui.
maikel
4

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 redirecionar 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]
Sourabh
fonte
O que L e R significam?
Aaron Franke
4

Faça tudo o que é explicado acima para redirecionar. Basta adicionar "HTTP Strict Transport Security" ao seu cabeçalho. 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

<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

Waqas
fonte
2

Para redirecionar todas as httpsolicitações para https, você pode usar:

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

Se mod-rewrite não estiver ativado e você estiver no apache 2.4, também poderá usar uma diretiva Redirectinterna ifpara redirecionar httpsolicitações https.

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
starkeen
fonte
2

Se você estiver em uma situação em que não pode acessar a configuração do apache diretamente para o seu site, que muitas plataformas hospedadas ainda estão restritas dessa maneira, eu recomendaria uma abordagem em duas etapas. A razão pela qual o próprio Apache documenta que você deve usar suas opções de configuração antes de mais nada 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, no (s) seu (s) arquivo (s) PHP (você precisa fazer isso sempre que for apropriado para a sua situação, alguns sites canalizarão todas as solicitações através de um único arquivo PHP, outros servirão várias páginas, dependendo de suas necessidades e da solicitação feita ):

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

O item acima precisa executar ANTES de qualquer código que possa expor potencialmente os dados seguros em um ambiente não seguro. Assim, seu site usa o redirecionamento automático via HTACCESS e mod_rewrite, enquanto seus scripts garantem que nenhuma saída seja fornecida quando não for acessada por HTTPS.

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. Esperamos que isso ajude alguém que possa ter que usar métodos não recomendados devido a restrições nos nossos serviços de hospedagem.

F. Scott Gale
fonte
1

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 isso para obter mais detalhes. Como redirecionar Http para Https?

Roshan Padole
fonte
1
Esta é a solução pronta para qualquer pessoa que receba um "erro de redirecionamento demais" e não possa alterar a propriedade allowOverride.
Evochrome
1

A menos que você precise de mod_rewrite para outras coisas, o uso da diretiva IF principal do Apache é mais limpa e rápida:

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

Você pode adicionar mais condições à diretiva IF, como garantir 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 no uso de 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).

SashaK
fonte
1

leve esse código para o seu arquivo .htaccess Redirecione HTTP para HTTPS automaticamente

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

Ehsan Sattari
fonte
Olá, obrigado pela resposta, o que sua resposta adiciona que outras respostas existentes não têm?
Gricey 17/05/19
Sobre o tipo semelhante de pergunta. Alguém pode ajudar com a pergunta abaixo? stackoverflow.com/questions/59503217/…
appsntech
0

Encontrei um método para forçar o redirecionamento de todas as páginas do site 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]
Oleg Apanovich
fonte
0
 Redirect 301 / https://example.com/

(funcionou para mim quando nenhuma das respostas acima funcionou)

Bônus:

ServerAlias www.example.com example.com

(https fixo: // www .example.com não encontrado)

aalesund
fonte
0

Isso redireciona todos os URLs para https e www

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
Husain Basrawala
fonte
0

Se você quiser fazer isso no servidor tomcat, siga as etapas abaixo

Em um servidor HTTP independente do Apache Tomcat (8.5.x), como configurá-lo para que, se um usuário digitar www.domain.com, ele seja encaminhado automaticamente para o site https (www.domain.com).

O método de duas etapas para incluir o seguinte em seu [Tomcat_base] /conf/web.xml antes da tag de fechamento

step 1: 
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

e definindo as configurações do conector [Tomcat_base] /conf/server.xml:

step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>

Nota: Se você já fez a configuração https e está tentando redirecionar, execute apenas a etapa 1.

Bhaskara Arani
fonte
-1

Uma vantagem diferente para esse problema é quando um Load Balancer entra em jogo.

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

Portanto, todas as variáveis ​​de solicitação do servidor no 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. Dá um loop ou simplesmente não funciona.

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

(Ou o Load Balancer está configurado incorretamente. Qual é o que eu estou esperando, porque então eu posso passar o problema para a empresa WebHosting :-))

BertC
fonte
O redirecionamento teria que acontecer no balanceador de carga. Dependendo do tipo de balanceador de carga, isso deve ser possível na configuração, ou é uma instância do apache, onde a resposta aceita funcionaria. Apenas não faça isso nos nós únicos.
Marc82ch 7/08/2015
-1

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

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

No arquivo httpd.conf:

<VirtualHost *:80>

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

</VirtualHost>

Ou no seu arquivo .htaccess raiz:

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

Bônus: ele não tentará redirecionar o tráfego http na sua máquina de desenvolvimento local.

ScottyB
fonte
-1

Funciona para mim:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

e, por exemplo, http: // server / foo? email = alguem% 40example.com redireciona normalmente sem problemas. O arquivo .htaccess localizado na pasta raiz do site (por exemplo, public_html). É possível usar RewriteCond% {SERVER_PORT}! ^ 443 $ em vez disso RewriteCond% {HTTPS}! On

Intacto
fonte