Para o Apache:
'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']
Você também pode usar em HTTP_HOST
vez de SERVER_NAME
como Herman comentou. Veja esta pergunta relacionada para uma discussão completa. Em suma, você provavelmente está bem em usar qualquer um. Aqui está a versão 'host':
'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']
Para os paranóicos / por que é importante
Normalmente, defino ServerName
no VirtualHost
porque quero que essa seja a forma canônica do site. O $_SERVER['HTTP_HOST']
é definido com base nos cabeçalhos da solicitação. Se o servidor responder a qualquer / todos os nomes de domínio nesse endereço IP, um usuário poderá falsificar o cabeçalho, ou pior, alguém poderá apontar um registro DNS para o seu endereço IP e, em seguida, seu servidor / site estará disponibilizando um site com dinâmica links criados em um URL incorreto. Se você usar o último método, também deverá configurar vhost
ou definir uma .htaccess
regra para impor o domínio que deseja exibir, algo como:
RewriteEngine On
RewriteCond %{HTTP_HOST} !(^stackoverflow.com*)$
RewriteRule (.*) https://stackoverflow.com/$1 [R=301,L]
#sometimes u may need to omit this slash ^ depending on your server
Espero que ajude. O ponto real desta resposta era apenas fornecer a primeira linha de código para as pessoas que acabaram aqui quando procuravam uma maneira de obter o URL completo com o apache :)