Eu tenho o seguinte código htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond !{HTTPS} off
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
Quero que meu site seja redirecionado para https://www.
HTTPS e imponha o www.
subdomínio, mas quando eu acesso http://www.
(sem HTTPS), ele não me redireciona para https://www
HTTPS.
RewriteCond %{HTTPS} =off
Respostas:
Para forçar o HTTPS pela primeira vez, você deve verificar a variável de ambiente correta
%{HTTPS} off
, mas sua regra acima precede a opçãowww.
Como você tem uma segunda regra a ser aplicadawww.
, não a use na primeira regra.Sobre proxy
Quando está por trás de algumas formas de proxy, nas quais o cliente está se conectando via HTTPS a um proxy, balanceador de carga, aplicativo de passageiro etc., a
%{HTTPS}
variável pode nunca estaron
e causar um loop de reescrita. Isso ocorre porque seu aplicativo está realmente recebendo tráfego HTTP simples, mesmo que o cliente e o proxy / balanceador de carga estejam usando HTTPS. Nesses casos, verifique oX-Forwarded-Proto
cabeçalho em vez da%{HTTPS}
variável. Esta resposta mostra o processo apropriadofonte
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
um URL como exaple.com/?bla=%20 tornou-se exaple.com/?bla=%2520 , ou seja, o sinal de porcentagem foi codificado. Considere usar o sinalizadorNE
para evitar a codificação dupla:RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
X-Forwarded-Proto
cabeçalho para verificar o HTTPS em vez da%{HTTPS}
variável. Você não disse qual parte causa o loop, awww
parte HTTPS, mas essa é a primeira coisa que me vem à mente.http://example.com
( por exemplo, HTTP e não www), você receberá um redirecionamento duplo. Primeiro parahttps://example.com
(a primeira regra) e depois parahttps://www.example.com
(a segunda regra). Você pode corrigir isso simplesmente revertendo essas duas regras, pois as duas regras redirecionam para HTTPS independentemente.A resposta de Michals funcionou para mim, embora com uma pequena modificação:
Problema:
quando você possui um único certificado de segurança do site , um navegador que tenta acessar sua página sem https: // www. (ou qualquer domínio que o seu certificado cubra) exibirá uma tela de aviso vermelha feia antes mesmo de receber o redirecionamento para a página https segura e correta.
Solução
Primeiro use o redirecionamento para o www (ou qualquer domínio coberto pelo seu certificado) e somente então o redirecionamento https. Isso garantirá que seus usuários não sejam confrontados com nenhum erro porque seu navegador vê um certificado que não cobre o URL atual.
fonte
https://example.com
, mas, na minha opinião, esse é o formato menos provável de ser digitado por um usuário. (A resposta aceita também terá o mesmo problema)https://
semwww
ter um certificado apenas nowww
, basta adicionar esta regra à solução:RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301]
Ela simplesmente volta aohttp
tentar se conectarhttps://example.com
para evitar erros de certificado.http://example.com
(ou seja, HTTP e sem www.)Se você estiver usando o CloudFlare ou um CDN semelhante, receberá um erro de loop infinito com as soluções% {HTTPS} fornecidas aqui. Se você é um usuário do CloudFlare, precisará usar o seguinte:
fonte
=http
para!=https
para nossos ambientes.X-Forwarded-Proto
cabeçalho não foi declarado se http, o mesmo!=https
aconteceu com o truque.{HTTPS}
não estava funcionando. Eu tentei{ENV:HTTPS}
e até mesmo{SERVER_PORT} 443
, mas no final foi porque eu precisava verificar os cabeçalhos de solicitação HTTP personalizados do Cloudflare.MAU SOLUÇÃO E POR QUE!
Nunca use a solução abaixo porque, quando você estiver usando o código deles, é algo como:
O navegador acessa:
Em seguida, redireciona para:
Em seguida, redireciona para:
Isso é muita solicitação para o servidor.
A maioria das respostas até aceitas tem esse problema.
MELHOR SOLUÇÃO E RESPOSTA
Este código tem uma
[OR]
condição para evitar alterações duplas no URL!fonte
RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
wp-content/cache/page_enhanced/
e assim por diante. Como posso consertar isso? Edit: Parece que eu preciso colocá-lo no topo.htaccess
. Obrigado pelo script :)Essa é a melhor maneira que encontrei para usuários proxy e não proxy
fonte
Existem muitas soluções por aí. Aqui está um link para o wiki do apache, que lida diretamente com esse problema.
http://wiki.apache.org/httpd/RewriteHTTPToHTTPS
fonte
RewriteCond %{HTTPS} off
paraRewriteCond %{HTTPS} !=on
que o redirecionamento sempre acontecesse, essa parece a melhor resposta para mim.Para redirecionar http: // ou https: // para https: // www, você pode usar a seguinte regra em todas as versões do apache:
Apache 2.4
Observe que a variável% {REQUEST_SCHEME} está disponível para uso desde o apache 2.4 .
fonte
Se você estiver no CloudFlare, use algo assim.
Isso salvará você do loop de redirecionamento e redirecionará seu site para SSL com segurança.
PS: É uma boa ideia verificar o mod_rewrite.c!
fonte
fonte
Notas: Verifique se você executou as seguintes etapas
Agora seu .htaccess funcionará e seu site será redirecionado para http: // para https: // www
fonte
Semelhante à solução htaccess de Amir Forsati redirecionada para https: // www, mas para nome de domínio variável, sugiro:
fonte
Defina no seu arquivo .htaccess
fonte
Eu usei o código abaixo deste site, ele funciona muito bem https://www.freecodecamp.org/news/how-to-redirect-http-to-https-using-htaccess/
Espero que ajude
fonte
Eu tento a primeira resposta e não funciona ... Este trabalho:
fonte