Como você redireciona HTTPS para HTTP?

166

Como você redireciona o HTTPS para o HTTP? Ou seja, o oposto do que (aparentemente) todo mundo ensina.

Eu tenho um servidor em HTTPS para o qual paguei uma certificação SSL e um espelho para o qual não tenho e permaneço por apenas emergências, para que não mereça obter uma certificação.

Nas áreas de trabalho do meu cliente, tenho ALGUNS atalhos que apontam para ( http://production_servere https://production_serverambos funcionam). No entanto, eu sei que se meu servidor de produção ficar inoperante, o encaminhamento de DNS será ativado e os clientes que possuem "https" no atalho estarão olhando https://mirror_server(o que não funciona) e uma grande tela vermelha de inquietação do Internet Explorer 7 para a minha empresa.

Infelizmente, não posso simplesmente mudar isso no nível do cliente. Esses usuários são muito analfabetos no computador: e muito provavelmente surtam de ver erros de "insegurança" HTTPS (especialmente a maneira como o Firefox 3 e o Internet Explorer 7 lidam com isso hoje em dia: PARADA COMPLETA, meio que felizmente, mas não me ajudando aqui, LOL).

É muito fácil encontrar soluções Apache para redirecionamento http-> https , mas pela minha vida não posso fazer o contrário.

Ideias?

mauriciopastrana
fonte
2
Não faça isso ! Os redirecionamentos HTTPS do HTTP são extremamente perigosos (e, de fato, serão bloqueados por todos os navegadores em breve devido a abuso), espacialmente se este for um nó via status HTTP silencioso (mas o mesmo se aplica se for feito por javascript), a menos que: - (1) há uma página de estacionamento HTTPS transitória convidando os usuários a enviar um link clicando nele ativamente; ou: (2) o HTTPS redireciona para HTTP exatamente no mesmo domínio E os redirecionamentos não alteram o tipo de conteúdo solicitado. Permitir isso nos navegadores permitiu que muitos malwares passassem pelo isolamento. Esses redirecionamentos são muito enganosos.
Verdy_p 4/10
4
Parece um site interno, onde o OP sabe o que está acontecendo com ele e, portanto, não é perigoso ... Se este era um servidor voltado para a Web, eu concordo com você, mas um servidor Web interno local somente, um redirecionamento no essa moda não seria um problema.
Stese 5/11
@verdy_p Estou trabalhando em redirecionamentos HTTPS para HTTP 302, o caso de portais em cativeiro. Você pode me indicar a documentação a que você está se referindo?
Jprusakova
Para o seu portal cativo, nunca execute nenhum redirecionamento HTTPS para HTTP 302, exceto se for exatamente para o mesmo domínio (nem mesmo um subdomínio). E como há um alto risco de divulgação de informações, cuidado com os tokens de sessão e os cookies transmitidos de forma transparente com o redirecionamento! Você deve saber que os destinos HTTP podem ser aprimorados e que as informações são obtidas por proxies transparentes de malware e até mesmo por DNS malicioso: seu usuário comum nem sabe que seu destino somente HTTP será inacessível e, na verdade, passará a um blackhat! Portanto, nunca faça isso nos links HTTPS que contêm sessões / cookies / solicitações privadas.
Verdy_p 17/02/19
Esse redirecionamento HTTPS 302 sempre é uma falha de segurança no site HTTPS. O grande risco é ter sessões roubadas e seus usuários autenticados terem suas contas particulares coletadas. E, em todos os casos, NUNCA faça redirecionamentos para carregar javascripts ou multimídia ativa: essa é uma porta aberta no domínio HTTPS "sandbox". Realmente considere fazer algo ao contrário: redirecione o HTTP para HTTPS (principalmente seu portal principal ou páginas públicas estáticas que não precisam de dados / sessões / cookies particulares) e use HTTPS para sempre. Se você precisar de obter de HTTPS para HTTP, use links padrão (em pedidos distintos)
verdy_p

Respostas:

128

Isso não foi testado, mas acho que isso deve funcionar usando mod_rewrite

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
ejunker
fonte
1
Como faço para que funcione (o que preciso alterar deste código para o meu domínio para que esse código funcione)?
Enve
1
Enve: Basta adicionar à configuração vhost_ssl.conf do seu site (ou .htaccess na raiz do site). Nada precisa ser alterado, ele usará dinamicamente o mesmo nome de host e caminho de URL.
Darren Felton
1
Eu acho que você também pode querer pegar seqüências de caracteres de consulta. Não tenho certeza, mas acho que o trecho acima não encaminhará as strings de consulta de https para http.
Rustavore
12
Conforme apontado por Kieron abaixo, isso não funcionaria se o servidor espelho não tivesse um certificado válido. Você ainda verá um grande aviso vermelho por causa de certificado inválido. Depois de começar a usar https, você fica basicamente preso a ela. Esteja preparado para pagar por isso pelo resto da sua vida. Se você parar de pagar, as pessoas que marcaram os links https não poderão acessar.
Stephen Cheng
2
Pagando pelo resto da sua vida? Você ainda pode usar HTTPS, mas altere seu provedor de PKI e obtenha novos certificados mais baratos. Você ainda pagará alguns dólares sim, mas o mesmo vale para o seu nome de domínio e sua hospedagem! Agora, um certificado PKI NÃO é caro comparado aos nomes de domínio e é insignificante comparado aos custos de hospedagem / largura de banda!
verdy_p
71

Lembre-se de que o mecanismo Rewrite só entra em ação após o recebimento da solicitação HTTP - o que significa que você ainda precisará de um certificado para que o cliente configure a conexão para enviar a solicitação!

No entanto, se a máquina de backup parecer ter o mesmo nome de host (no que diz respeito ao cliente), não deverá haver motivo para que você não possa usar o mesmo certificado que a máquina de produção principal.

Kieron
fonte
1
Como essa limitação pode ser superada? Estou tendo o mesmo problema. recebendo o erro de certificado do navegador antes do redirecionamento.
Sandeep Balagopal
Seria bom ter um back redirecionamento para HTTP se houver um erro de certificado
Jeffrey do Giraffe
Isso completamente derrota o propósito de ter HTTPS em primeiro lugar
FluffyBeing
12

Com base na resposta do ejunker, esta é a solução que funciona para mim, não em um único servidor, mas em um ambiente em nuvem

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
antoniom
fonte
Usar 301 pode ser um pouco perigoso. 301 significa permenantemente removido e acho que ir de https para http é temporariamente. Veja esta resposta aceita para saber quais serão os contras para os usuários stackoverflow.com/questions/1393280/…
yusuf tezel
A distinção permanente / temporária 301/302 é relevante apenas para os mecanismos de pesquisa.
matthewv789
9

Para aqueles que estão usando um .confarquivo.

<VirtualHost *:443>
    ServerName domain.com
    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/domain.crt
    SSLCertificateKeyFile /etc/apache2/ssl/domain.key
    SSLCACertificateFile /etc/apache2/ssl/domain.crt

</VirtualHost>
Rick
fonte
8

Se nenhuma das soluções acima funcionar para você (elas não funcionaram para mim), aqui está o que funcionou no meu servidor:

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]
rg88
fonte
6
Muitas vezes, você não deseja o L,(que significa "Última regra"). Se você estiver usando o wordpress ou outro CMS, o Lsinalizador poderá impedir que a solicitação da página seja roteada corretamente. Em vez disso, use:RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301]
Rustavore 14/05
5

todas as opções acima não funcionaram quando usei o cloudflare, este funcionou para mim:

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

e este definitivamente funciona sem proxies no caminho:

RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
mikulabc
fonte
3

É melhor evitar usar mod_rewrite quando puder.

No seu caso, eu substituiria a reescrita por esta:

    <If "%{HTTPS} == 'on'" >
            Redirect permanent / http://production_server/
    </If>

A <If>diretiva está disponível apenas no Apache 2.4+, de acordo com este blog aqui .

sys0dm1n
fonte
Em um ambiente hospedado, pode-se verificar a versão do Apache usando/usr/sbin/httpd -v
Serge Stroobandt
1

isso funciona para mim.

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

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

certifique-se de ouvir as portas 80 e 443.

jaxarroyo
fonte
0

Nenhuma das respostas funciona para mim no site do Wordpress, mas funciona a seguir (é semelhante a outras respostas, mas tem uma pequena alteração)

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Yuseferi
fonte
Não use essas regras às cegas com todos os REQUEST_URI (isso não deve ser usado se houver dados de formulário no URI ou IDs de cookies / sessões nos metadados da solicitação). Use-o apenas para páginas / imagens públicas estáticas. Evite-o completamente para javascripts ou componentes ativos (principalmente fluxos de vídeo com script ou PDF ativo, a menos que sejam assinados digitalmente por você! Ainda não é possível assinar digitalmente javascripts, mantenha-os apenas em seu domínio seguro).
verdy_p
Nota: alguns formatos de imagem são ativos e programáveis: cuidado com o SVG, por exemplo. Vimos ataques em alguns sites HTTPS carregando imagens SVG de HTTP (com redirecionamentos 302 do site) e colhidos por malwares inserindo scripts no conteúdo SVG ... Idealmente, os navegadores devem isolar subcontentos HTTP do HTTPS e colocá-lo em uma sandbox (para que o CORS as restrições de segurança também devem ser aplicadas, mesmo que estejam no mesmo nome de domínio ...), para que "http: // (domínio) / ..." e "https: // (domínio) /" sejam considerados domínios distintos para CORS (não a mesma origem), mesmo que estejam no mesmo número de porta TCP.
Verdy_p 17/02/19
@verdy_p, o que exatamente você quer dizer com "com o site 302 redireciona"? Você deve possuir o site do servidor primeiro (ou nós participantes no nível TCP / IP, como servidores DNS, roteadores), para explorar essas solicitações de recursos HTTP, certo?
Sz.
Não necessariamente. O HTTPS em um domínio será seguro, enquanto o HTTP no mesmo domínio não será (explorações não requerem controle de um IP ou roteadores ou servidores DNS, mesmo ao usar o DNSSEC; as explorações podem apenas usar falsificação de IP, que não podem ser detectadas com segurança sem o HTTPS. sessões seguras). Por isso, mantenho que um site HTTPS deve hospedar imagens (mesmo no mesmo domínio) por não fornecê-las com HTTP (até mesmo é negado por padrão em alguns navegadores que exigem um clique de ativação ou mascaram essas imagens não seguras). HTTPS / HTTP misto deve ser banido: o site é atacável em suas partes HTTP (por exemplo, pixels de trilha).
verdy_p
-6

Tanto quanto sei que uma simples atualização meta também funciona sem causar erros:

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">
RobinUS2
fonte
12
Desejo que os eleitores que não votem sejam obrigados a deixar comentários explicando as razões dos votos negativos. Pessoalmente, eu não escolheria essa resposta a menos que você, como desenvolvedor, não tivesse acesso ao servidor para o qual estava desenvolvendo, mas tivesse acesso à página. Um problema é que você precisará codificar todos os caminhos de todas as páginas para que isso funcione. Se você puder assumir que o JavaScript está ativado para seus casos de uso importantes, seria melhor usar o JavaScript para mudar para http. As respostas acima são melhores porque não requerem javascript, pois acontecem no servidor.
Rustavore 14/05
2
Simplesmente: porque o htaccess é uma opção muito melhor do que isso. Além disso, ele não corrigirá o problema para redirecionar o protocolo https para http se você não tiver um certificado.
midudev 14/06
1
A ação deve ser processada pelo servidor, e não um documento que possa servir.
Alval #