Como obter uma URL completa no PHP?

Em muitos momentos é necessário obter o endereço completo que o usuário digitou na barra de endereço. Por isso o PHP fornece formas de se obter estes dados. Vamos lá?

O que vamos aprender neste tutorial?

Vamos utilizar a Global $_SERVER e obter duas variáveis que ela disponibiliza, HTTP_HOST e REQUEST_URI em seu array. Por sortes utilizando estes dois valores formam a URL requisitada completa.

O código

<?php

$url_completa ="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo $url_completa;

?>

Vamos supor que você esteja acessando o seguinte site (imagem abaixo) e o código acima esteja em execução, qual será a saída do nosso echo?

Bom a saída será:

http://www.kali.org/docs/virtualization/install-hyper-v-guest-enhanced-session-mode/

Se você notou nos usamos duas variáveis disponíveis no array global $_SERVER. O primeiro sendo o http_host e o segundo request_uri, que, como o nome diz, o primeiro é o endereço do domínio(DNS completo incluindo subdomínios) e o segundo o URI (conteúdo após a barra).

Viu que legal, agora você consegue obter o endereço atual que seu usuário está.

Segurança

É importante ficar atento, pois, um invasor pode forjar os dados presentes no http_host, por isto sempre sanitize qualquer dado obtido a partir do navegador e não utilize estes dados como parâmetro de funções vulneráveis como eval().

Melhorando a detecção

Se você notou em nosso código definimos uma string arbitrária definindo a página como ‘http://’. Entretanto, o que acontece se o site possuir HTTPS e você usar nossa função para criar certos links? Provavelmente nada de bom, navegadores modernos bloqueiam conteúdo misto, quando são carregados elementos inseguros (http) em páginas seguras(https).

Para contornar o problema você pode usar uma função como a abaixo. Cortesia do WordPress.

<?php

function is_ssl() {
    if ( isset( $_SERVER['HTTPS'] ) ) {
        if ( 'on' == strtolower( $_SERVER['HTTPS'] ) ) {
            return true;
        }
        if ( '1' == $_SERVER['HTTPS'] ) {
            return true;
        }
    } elseif ( isset( $_SERVER['SERVER_PORT'] ) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
        return true;
    }
    return false;
}

?>

Related posts

Leave a Comment