Redirecionando de HTTP para HTTPS com PHP

107

Estou trabalhando em um site de carrinho de compras e gostaria de redirecionar o usuário para uma página HTTPS quando ele estiver inserindo seus detalhes de faturamento e manter a conexão HTTPS para as próximas páginas até que ele saia.

O que preciso instalar no servidor (estou usando Apache) para fazer isso e como esse redirecionamento pode ser feito a partir do PHP?

Psique
fonte

Respostas:

247

Tente algo assim (deve funcionar para Apache e IIS):

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
Raphael Michel
fonte
5
Nem sempre funciona. Eu tentei usá-lo e não havia nenhum elemento 'https' no array $ _SERVER devido ao qual estava dando um erro de 'muitos redirecionamentos'. Precisaria usar outro método.
Usman Zaheer
5
Eu tive que testar if( $_SERVER['HTTPS'] == "off")para fazer esse código funcionar. Acho que é porque estou no IIS, não no Apache como o OP.
Nick Pickering
1
@NicholasPickering Jepp, as variáveis ​​$ _SERVER podem variar com os servidores da web.
Raphael Michel
6
Nota: die () ou exit () podem ser importantes para colocar depois de redirecionamentos de cabeçalho para evitar que o resto da página seja executado (e possivelmente envie informações extras para o cliente) (ou seja, para hackers ou navegadores que podem não respeitar o cabeçalho).
dia
3
Dependendo do ambiente / configuração do seu servidor, você pode precisar usar $ _SERVER ['HTTP_X_FORWARDED_PROTO'] para verificar se há http / https
David Meister
19

Esta é uma boa maneira de fazer isso:

<?php
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
   $_SERVER['HTTPS'] == 1) ||  
   isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
   $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
   $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
   header('HTTP/1.1 301 Moved Permanently');
   header('Location: ' . $redirect);
   exit();
}
?>
Matiasg1982
fonte
1
funciona bem aquele marcado como bom retornará um redirecionamento muitas vezes, pelo menos no Chrome
Thomas J Younsi
A condição !(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'sempre será falsa, pois se a última parte for verdadeira, a primeira será falsa.
Máx.
@ Max: Não entendo o que você diz. Se a segunda condição for verdadeira ($ _SERVER ['HTTPS'] == 'on') então a primeira condição terá que ser TRUE também (é claro que a variável do servidor está definida, porque contém um valor!)
OMA
7

Redirecionando de HTTP para HTTPS com PHP no IIS

Eu estava tendo problemas para obter o redirecionamento para HTTPS para funcionar em um servidor Windows que executa a versão 6 do MS Internet Information Services (IIS) . Estou mais acostumado a trabalhar com o Apache em um host Linux, então procurei ajuda na Internet e essa foi a pergunta do Stack Overflow de melhor classificação quando pesquisei “redirecionamento de php de http para https” . No entanto, a resposta selecionada não funcionou para mim.

Após algumas tentativas e erros, descobri que, com o IIS, $_SERVER['HTTPS']está definido como offpara conexões não-TLS. Achei que o código a seguir deveria ajudar qualquer outro usuário do IIS que chegar a essa questão por meio de mecanismo de pesquisa.

<?php
if (! isset($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == 'off' ) {
    $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header("Location: $redirect_url");
    exit();
}
?>

Edit : De outra resposta Stack Overflow , uma solução mais simples é verificar if($_SERVER["HTTPS"] != "on").

Anthony Geoghegan
fonte
13
@JakeSylvestre Bastante justo. Visto que esta pergunta não está marcada como apache, postei esta resposta para o benefício de outros usuários do IIS (semelhante à situação em que eu estava) que podem encontrar esta página através do mecanismo de busca. Eu concordo com a visão de que as respostas são para o benefício da comunidade como um todo e não apenas para o OP.
Anthony Geoghegan
6

Você sempre pode usar

header('Location: https://www.domain.com/cart_save/');

para redirecionar para o URL de salvamento.

Mas eu recomendaria fazer isso por .htaccess e as regras de reescrita do Apache.

powtac
fonte
13
Eu sempre recomendaria verificar $ _SERVER ['HTTPS'] antes de redirecionar.
Raphael Michel
$ _SERVER ['HTTPS'] nem sempre é definido, mas é uma boa ideia verificar antes. É por isso que eu recomendo fazer isso com uma regra de reescrita útil no Apache, que só redireciona quando não está em HTTPS.
powtac
Embora o Apache recomende não usar um arquivo .htaccess extra (porque ele fica mais lento), mas usar as regras de reescrita dentro do * .conf do Apache.
powtac de
1

Em meu servidor beanstalk AWS, não vejo a variável $ _SERVER ['HTTPS']. Vejo $ _SERVER ['HTTP_X_FORWARDED_PROTO'] que pode ser 'http' ou 'https', então se você estiver hospedando na AWS, use isto:

if ($_SERVER['HTTP_HOST'] != 'localhost' and $_SERVER['HTTP_X_FORWARDED_PROTO'] != "https") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
Fénix
fonte