Eu já vi muitos tutoriais online que dizem que você precisa verificar $_SERVER['HTTPS']
se o servidor está conectado à conexão com HTTPS. Meu problema é que, em alguns servidores que uso, $_SERVER['HTTPS']
é uma variável indefinida que resulta em um erro. Existe outra variável que posso verificar que sempre deve ser definida?
Só para esclarecer, atualmente estou usando este código para resolver se é uma conexão HTTPS:
if(isset($_SERVER['HTTPS'])) {
if ($_SERVER['HTTPS'] == "on") {
$secure_connection = true;
}
}
Secure
cookies. Tenha cuidado com as dicas embora.Respostas:
Isso sempre deve funcionar mesmo quando
$_SERVER['HTTPS']
está indefinido:O código é compatível com o IIS.
Na documentação do PHP.net e nos comentários dos usuários :
Além disso, os servidores Apache 1.x (e instalações quebradas) podem não ter sido
$_SERVER['HTTPS']
definidos, mesmo que você se conecte com segurança. Apesar de não ser garantido, conexões na porta 443 são, por convenção , provavelmente usando Secure Sockets , portanto, a verificação de porta adicional.Nota adicional: se houver um balanceador de carga entre o cliente e o servidor, esse código não testará a conexão entre o cliente e o balanceador de carga, mas a conexão entre o balanceador de carga e o servidor. Para testar a conexão anterior, você precisaria testar usando o
HTTP_X_FORWARDED_PROTO
cabeçalho, mas é muito mais complexo; veja os comentários mais recentes abaixo desta resposta.fonte
getservbyname()
é apenas uma referência, não a realidade, e não garante, de forma alguma, que o HTTPS esteja sendo executado na porta 443.$_SERVER['SERVER_PORT'] !== 443
tive que converter$_SERVER['SERVER_PORT]
para um número inteiro como este:intval($_SERVER['SERVER_PORT]) !== 443
strtolower($_SERVER['HTTPS']) !== 'off'
fez o truque.Minha solução (porque as condições padrão [$ _SERVER ['HTTPS'] == 'on'] não funcionam em servidores atrás de um balanceador de carga) é:
HTTP_X_FORWARDED_PROTO: um padrão de fato para identificar o protocolo de origem de uma solicitação HTTP, já que um proxy reverso (balanceador de carga) pode se comunicar com um servidor da Web usando HTTP, mesmo que a solicitação para o proxy reverso seja HTTPS http: //en.wikipedia. org / wiki / List_of_HTTP_header_fields # Common_non-standard_request_headers
fonte
Chacha, de acordo com a documentação do PHP: "Defina como um valor não vazio se o script foi consultado através do protocolo HTTPS". Portanto, sua declaração if retornará false em muitos casos em que o HTTPS está realmente ativado. Você deseja verificar se
$_SERVER['HTTPS']
existe e não está vazio. Nos casos em que o HTTPS não está definido corretamente para um determinado servidor, você pode tentar verificar se$_SERVER['SERVER_PORT'] == 443
.Mas observe que alguns servidores também definirão
$_SERVER['HTTPS']
um valor não vazio, portanto, verifique também essa variável.Referência: documentação
$_SERVER
e$HTTP_SERVER_VARS
[obsoleta]fonte
HTTP_X_FORWARDED_PROTO
ouHTTP_X_FORWARDED_SSL
também.(((isset($_SERVER['HTTPS'])) && (strtolower($_SERVER['HTTPS']) == 'on')) || ((isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) && (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https')))
que não inclui o cheque da porta. Sinta-se livre para adicionar. :-)SetEnvIf X-Forwarded-SSL on HTTPS=on
fará o truque. Mas isso não vai funcionar comREQUEST_SCHEME
como resultado em php parece melhor usar$_SERVER['HTTPS']
Isso também funciona quando
$_SERVER['HTTPS']
está indefinidofonte
$_SERVER['HTTPS']
ainda não está definido o https está ativado. Que tal isso?SERVER_PORT
é definido sempre que resolve o problema indefinido deHTTPS
Acabei de ter um problema em que eu estava executando o servidor usando o Apache mod_ssl, mas um phpinfo () e um var_dump ($ _SERVER) mostraram que o PHP ainda acha que estou na porta 80.
Aqui está minha solução alternativa para qualquer pessoa com o mesmo problema ....
A linha que vale a pena notar é a linha SetEnv. Com isso em vigor e após uma reinicialização, você deve ter a variável de ambiente HTTPS com a qual sempre sonhou
fonte
Fazendo minha própria função lendo todas as postagens anteriores:
fonte
Se você estiver usando o Apache, poderá sempre contar com
para verificar o esquema do URL solicitado. Mas, como mencionado em outras respostas, é prudente verificar outros parâmetros antes de assumir que o SSL está realmente sendo usado.
fonte
A resposta REAL: pronta para copiar e colar em um script [config]
$pv_URIprotocol
agora está correto e pronto para ser usado; exemplo$site=$pv_URIprotocol.$_SERVER["SERVER_NAME"]
. Naturalmente, a string também pode ser substituída por TRUE e FALSE. PV significa PortalPress Variable, pois é uma cópia e colagem direta que sempre funcionará. Esta peça pode ser usada em um script de produção.fonte
Não acho que adicionar uma porta seja uma boa ideia - especialmente quando você tem muitos servidores com diferentes compilações. isso apenas acrescenta mais uma coisa para lembrar de mudar. olhando os documentos, acho que a última linha de kaisers é muito boa, de modo que:
parece perfeitamente suficiente.
fonte
O único método confiável é o descrito por Igor M.
Considere o seguinte: Você está usando o nginx com fastcgi, por padrão (debian, ubuntu) fastgi_params contém a diretiva:
fastcgi_param HTTPS $ https;
se você NÃO estiver usando SSL, ele será traduzido como valor vazio, não 'off', não 0 e você estará condenado.
http://unpec.blogspot.cz/2013/01/nette-nginx-php-fpm-redirect.html
fonte
Acho esses parâmetros aceitáveis também e, mais do que provavelmente, não têm falsos positivos ao trocar de servidor da web.
$ _SERVER ['HTTPS_SERVER_SUBJECT']
fonte
Maneira mais curta que estou usando:
Se https for usado, $ secure_connection é true.
fonte
echo (!empty($_SERVER['HTTPS'])?'https':'http');
dá-lhehttp
ouhttps
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
Você pode verificar
$_SERVER['SERVER_PORT']
como o SSL normalmente é executado na porta 443, mas isso não é infalível.fonte
O que você acha disso?
fonte
No meu servidor (Ubuntu 14.10, Apache 2.4, php 5.5) a variável
$_SERVER['HTTPS']
não é definida quando o script php é carregado via https. Eu não sei o que está errado. Mas as seguintes linhas no.htaccess
arquivo corrigem esse problema:fonte
Aqui está uma função reutilizável que venho usando há algum tempo. HTH.
Nota: O valor de HTTPS_PORT (que é uma constante personalizada no meu código) pode variar em seu ambiente, por exemplo, pode ser 443 ou 81.
fonte
só por interesse, o chrome canary no momento envia
para o servidor, e dependendo de como o servidor estiver configurado pode significar que você retornará as seguintes
Isso interrompeu nosso aplicativo porque estávamos testando se estava ativado, o que obviamente não está. No momento, apenas o cromo canário parece fazer isso, mas vale a pena notar que as coisas do canário geralmente caem no cromo "normal" pouco tempo depois.
fonte
Se você usar o nginx como sistema de balanceamento de carga, verifique $ _SERVER ['HTTP_HTTPS'] == 1 outras verificações falharão no ssl.
fonte
O código está verificando tudo o que é possível e funciona também no servidor web IIS. O Chrome desde a v44 não define o cabeçalho HTTP: 1, portanto, verificar HTTP_HTTPS está OK. Se esse código não corresponder a https, significa que o servidor da web ou o servidor proxy está mal configurado. O próprio Apache define o sinalizador HTTPS corretamente, mas pode haver um problema ao usar o proxy (por exemplo, nginx). Você deve definir algum cabeçalho no host virtual nginx https
e use algum módulo Apache para definir o sinalizador HTTPS corretamente, procurando por X-HTTPS no proxy. Pesquise mod_fakessl, mod_rpaf etc.
fonte
Se você estiver usando o balanceador de carga do Incapsula, precisará usar um IRule para gerar um cabeçalho personalizado para o seu servidor. Criei um cabeçalho HTTP_X_FORWARDED_PROTO que é igual a "http" se a porta estiver definida como 80 e "https" se for igual a 443.
fonte
Eu adicionaria um filtro global para garantir que tudo o que estou verificando esteja correto;
fonte
Tenho a oportunidade de dar um passo adiante e determinar se o site ao qual estou me conectando é compatível com SSL (um projeto solicita ao URL o usuário e precisamos verificar se ele instalou nosso pacote de API em um site http ou https).
Aqui está a função que eu uso - basicamente, basta ligar para o URL via cURL para ver se o https funciona!
Esta é a maneira mais confiável que eu encontrei, não apenas para descobrir se você está usando https (como a pergunta pergunta), mas se você PODERIA (ou DEVE) usar https.
NOTA: é possível (embora não seja muito provável ...) que um site possa ter páginas http e https diferentes (por isso, se lhe for pedido para usar http, talvez você não precise alterar ..) A grande maioria dos sites são os mesmos e provavelmente devem redirecionar a si mesmos, mas essa verificação adicional tem seu uso (certamente como eu disse, no projeto em que o usuário insere as informações do site e você quer ter certeza do lado do servidor)
fonte
É assim que eu acho resolver isso
fonte
Usei a sugestão principal aqui e fiquei irritado com o "Aviso sobre PHP" nos logs quando o HTTPS não estava definido. Você pode evitá-lo usando o operador de coalescência nula "??":
(Nota: não disponível antes do php v7)
fonte
Conforme a postagem do hobodave: "Defina como um valor não vazio se o script foi consultado através do protocolo HTTPS".
fonte
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')