Solucionado (ver solução)
Solucionado
(ver solução)
16
respostas

Redirecionar http>https com .htaccess

Boa tarde! Não consigo de forma alguma testar se o meu endereço encontra-se em https...

Alguma alma caridosa poderia me auxiliar a redirecionar para o https?

Eu tenho instalado na minha hospedagem Uol Host o let's encrypt... E eu não sei se existe alguma relação direta (ainda estou começando minha vida em programação e sei muito pouco do inglês) entre o comando:

RewriteCond %{HTTPS} off

E a validação let's encrypt... Eu acredito deva ser algo relacionado a ao tipo de validação que esta sendo feita pelo encrypt que impede que o comando RewriteCond verifique o host...

Atualmente esta assim meu .htaccess

<files ~ "^.*\.([Hh][Tt][Aa])">
    order allow,deny
    deny from all
    satisfy all
</files>
Options -Indexes
Options +FollowSymLinks
ErrorDocument 400 /redirects/400.html
ErrorDocument 401 /redirects/401.html
ErrorDocument 403 /redirects/403.html
ErrorDocument 404 /redirects/404.html

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    #Tentativas RewriteCond %{HTTPS} (FALHA TUDO QUE TENTEI)
    RewriteCond %{HTTP_HOST} ^exemplo\.com\.br [NC] #verifica se falta www (MENOR IDEIA DO PQ DO NC)
    RewriteRule ^(.*)$ https://www.exemplo.com.br/$1 [R=301,L] #301 Moved Permanently
    #Atualmente consegue redirecionar de exemplo.com.br para https://www.exemplo.com.br
</IfModule>

Tentei configurar:

...
RewriteCond %{HTTPS} off [OR] #não funcionou
RewriteCond %{HTTPS} =off [OR] #não funcionou
RewriteCond %{SERVER_PORT} 80 [OR] #não funcionou
RewriteCond %{SERVER_PORT} =80 [OR] #não funcionou
RewriteCond %{SERVER_PORT} ^80$ [OR] #não funcionou
RewriteCond %{HTTP_HOST} ^exemplo\.com\.br [NC]
RewriteRule ^(.*)$ https://www.exemplo.com.br/$1 [R=301,L]
...

sempre retorna o erro:

"Esta página não está funcionando

Redirecionamento em excesso por www.exemplo.com.br

Tente limpar os cookies.

ERR_TOO_MANY_REDIRECTS"

16 respostas

Olá, Léo.

Faz um tempo que não trabalho com o .htaccess, mas pelo o que eu me lembro só é necessário isso:

RewriteCond %{SERVER_PORT} ^80$
 RewriteRule ^.*$ https://%{nome_server}%{request_uri} [R=301,L]

Espero que ajude :-)

Muito obrigado pela força Marco.. Mas infelizmente não funcionou... Preciso encontrar uma outra forma de redirecionar, talvez sem utilizar o RewriteRule.

Pois bem.. Eu acabei de por a prova minha teoria e desinstalei o let's encrypt...

RewriteCond %{HTTPS} =off [OR] #funcionou
RewriteCond %{SERVER_PORT} =80 [OR] #funcionou

Funcionou o redirecionamento mas obviamente não resolve meu problema pois não tenho um certificado sem o let's encrypt instalado.

O problema esta no trâmite da validação do let's encrypt... vou tentar fazer a pergunta no stackoverflow

Que triste mano, vou invocar mais pessoas nessa dúvida .

Espero que amanhã, posso ter uma resposta :-)

Será que não é cache do redirect no seu browser? Algum redirect de antes que fazia https - > http... Sei lá. Talvez tentar com curl e ver se vai.

Senão eu chutaria que tem alguma outra regra em outro canto fazendo esse redirect de volta de https pra http. Talvez até na hospedagem

Eu pensei em cache e fiz testes para descartar a possibilidade. Eu acredito que deva ser algo relacionado com o tipo de validação do let's encrypt. Eu li em algum lugar em inglês (que não eh o meu forte) que pela validação ser no mesmo domínio o Rewrite https não funciona (mas não sei se entendi errado)...

https://community.letsencrypt.org/t/err-too-many-redirects-error/5292

No stackoverflow tbm sem solução por agora...

https://pt.stackoverflow.com/questions/208546/redirecionar-http-para-https-no-htaccess-com-lets-encrypt

Desculpe a ignorância Sérgio... mas como que eu usaria o curl? o.o'

De toda forma: muito obrigado pelo apoio gente!

Na linha de comando, roda o curl (ou, se o dominio for publico, diz que eu rodo aqui).

Por exemplo no site da Alura:

curl -I http://www.alura.com.br

Ele cospe os headers e ai da pra ver o redirect pro https:

HTTP/1.1 302 Found
Location: https://www.alura.com.br/
X-Cloud-Trace-Context: eae5f98e6e653ee9bd0b5087118f1d4a
Date: Tue, 30 May 2017 17:13:14 GMT
Content-Type: text/html
Server: Google Frontend
Transfer-Encoding: chunked

O meu domínio: https://www.monvel.com.br (que por sinal eu tenho que agradecer a vocês, pois consegui construir ele apos ser aluno da Alura) Atualmente a linha no htaccess que testa o https esta comentada e eu apenas executo o redirecionamento de "monvel.com.br" para "www.monvel.com.br"

ps: gratz pelo 600º post

Hahaha. 600º

Entao, o redirect ta desabilitado agora ne. Fazendo um curl -I sempre volta:

HTTP/1.1 200 OK
Date: Tue, 30 May 2017 17:34:21 GMT
Content-Type: text/html
Content-Length: 60828
Connection: keep-alive
Server: Apache
Last-Modified: Tue, 30 May 2017 05:25:40 GMT
ETag: "ed9c-550b708ce22ab"
Accept-Ranges: bytes
Cache-Control: max-age=0
Expires: Tue, 30 May 2017 17:34:21 GMT
X-Cache-Status: BYPASS

vou habilitar o redirecionamento agora:

Pronto, a linha

RewriteCond %{HTTPS} =off [OR]

esta descomentada

Certo, então o que ta acontecendo é que a versao HTTPS ta fazendo o redirect pra HTTPS mesmo (diferente do que eu achava antes).

O primeiro redirect ta ok:

$ curl -I http://www.monvel.com.br/
HTTP/1.1 301 Moved Permanently
Date: Tue, 30 May 2017 18:02:45 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Server: Apache
Location: https://www.monvel.com.br/
Cache-Control: max-age=0
Expires: Tue, 30 May 2017 18:02:45 GMT
X-Cache-Status: BYPASS

Ja esse nao devia ter:

$ curl -I https://www.monvel.com.br/
HTTP/1.1 301 Moved Permanently
Date: Tue, 30 May 2017 18:02:51 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Server: Apache
Location: https://www.monvel.com.br/
Cache-Control: max-age=0
Expires: Tue, 30 May 2017 18:02:51 GMT
X-Cache-Status: BYPASS

Tem alguma coisa errada na condicao. E se tentar a versao simples mesmo so com a regra do HTTPS. Algo assim talvez:

RewriteCond %{HTTPS} off 
RewriteRule ^(.*)$ https://www.exemplo.com.br/$1 [R=301,L]

Feita a alteração:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{HTTPS} off 
    RewriteRule ^(.*)$ https://www.monvel.com.br/$1 [R=301,L]
</IfModule>

removido o teste:

RewriteCond %{HTTP_HOST} ^exemplo\.com\.br [NC]

cache limpada e instância dedicada do servidor reiniciada.

ps1: deveria ter o "charset=iso-8859-1"?

Tipo, meu html está configurado como:

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

ps2: eu havia testado antes de fazer a pergunta sem o:

<IfModule mod_rewrite.c>
...
</IfModule>

o resultado é o mesmo...

Caramba, nada, mesmo resultado. To sem ideias aqui...

Você consegue me ajudar (por favor) a entender o que significa esta discussão? pq eu não tenho a menor ideia do que significa cloudflare

https://community.letsencrypt.org/t/what-is-the-correct-cloudflare-configuration-to-use-once-certs-are-installed/18861/4

pq parece que ela foi a resposta para um problema semelhante ao meu aqui:

https://community.letsencrypt.org/t/err-too-many-redirects-error/5292/2

Então, não é o nosso caso. O cloudflare é um serviço externo de CDN. Ele atua como um proxy (intermediário) entre o browser e seu servidor final. Aí o problema do cara é que ele tava fazendo o redirect na ponta errada e ficava em loop.

Não é o nosso caso onde o servidor final já é direto com HTTPS.

Ou muito obrigado pela explicação!

Então: danou-se pq, por ora, era a minha esperança.

Eu abri um chamado no UOLHOST para ver se eles sabem de alguma coisa... nem resposta eles deram :(

solução!

"Também uso Let's Encrypt e tive um problema semelhante, mas resolvi no VirtualHosts do Apache.

Como no seu caso, você só tem acesso ao .htaccess, testei alguns métodos em um servidor meu, e trouxe o que funcionou melhor."

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

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

# Verifica requisições POST
RewriteCond %{REQUEST_METHOD} !^POST$

# Se estiver recebendo uma requisição http de um proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

#...ou só uma requisição diretamente do cliente
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redireciona para a versão HTTPS
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

</IfModule>

"Acredito que essa solução funcione também para o seu caso."

E funcionou a solução !!!! =D https://pt.stackoverflow.com/a/210108/76778

Obrigado novamente pela força gente!