$_SERVER
PHP é uma linguagem de script server-side popular. Saiba como usar a superglobal $_SERVER para acessar dados de requisição e do servidor.
Entendendo as Superglobais do PHP e a Variável $_SERVER
PHP é uma linguagem de script server-side popular usada para desenvolvimento web. Um de seus recursos é o conjunto de superglobais — variáveis embutidas que estão sempre disponíveis em qualquer escopo, então você nunca precisa declará-las com a palavra-chave global. Este artigo foca na superglobal $_SERVER: o que ela contém, as chaves mais utilizadas e como lê-la com segurança.
Para uma visão geral de todas as superglobais ($_GET, $_POST, $_SESSION, $_COOKIE e mais), veja PHP Superglobals.
O que é a Variável $_SERVER?
$_SERVER é um array associativo que o servidor web preenche a cada requisição. Ele contém informações sobre o servidor, o script atual e a requisição HTTP recebida — cabeçalhos, caminhos, o método da requisição, o endereço IP do visitante e variáveis de ambiente selecionadas do sistema.
Por ser um array, você lê informações individuais por chave, por exemplo $_SERVER['REQUEST_METHOD'].
Chaves mais utilizadas
| Chave | O que retorna |
|---|---|
$_SERVER['REQUEST_METHOD'] | O método HTTP da requisição (GET, POST, PUT, …). |
$_SERVER['REQUEST_URI'] | O caminho e a query string da URL solicitada, ex.: /products?id=5. |
$_SERVER['QUERY_STRING'] | Apenas a parte da query string da URL, ex.: id=5. |
$_SERVER['HTTP_HOST'] | O host (e porta) do cabeçalho Host da requisição. |
$_SERVER['SERVER_NAME'] | O nome do host conforme configurado no próprio servidor. |
$_SERVER['HTTPS'] | Não vazio quando a requisição foi feita via HTTPS. |
$_SERVER['REMOTE_ADDR'] | O endereço IP de onde a requisição parece ter vindo. |
$_SERVER['HTTP_USER_AGENT'] | O cabeçalho User-Agent do cliente (identidade do navegador/bot). |
$_SERVER['HTTP_REFERER'] | A URL da página que linkou para o script atual, se houver. |
$_SERVER['SCRIPT_FILENAME'] | Caminho absoluto no sistema de arquivos do script em execução. |
$_SERVER['DOCUMENT_ROOT'] | Diretório raiz do documento configurado para o site. |
$_SERVER['PHP_SELF'] | Caminho do script atual relativo ao diretório raiz do documento. |
$_SERVER['SERVER_PROTOCOL'] | Protocolo da requisição, ex.: HTTP/1.1. |
Nota: Quais chaves estão presentes depende do servidor web (Apache, Nginx + PHP-FPM, o servidor CLI embutido, …). Na linha de comando, muitas chaves relacionadas à requisição estão completamente ausentes. Sempre leia com cuidado — veja a seção de segurança abaixo.
Inspecionando $_SERVER
Quando não tiver certeza do que um determinado ambiente fornece, faça um dump de todo o array:
<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';Isso exibe cada par chave/valor que o servidor disponibilizou para a requisição atual, sendo a forma mais rápida de descobrir no que você pode confiar.
Ramificando com base no método da requisição
Um uso muito comum de $_SERVER é decidir o que fazer com base em como a página foi solicitada. Uma página de formulário, por exemplo, exibe o formulário em uma requisição GET e processa os dados enviados em uma requisição POST:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Handle the submitted form data (validate, save, …)
echo 'Processing your submission';
} else {
// First visit — show the empty form
echo 'Showing the form';
}Esse padrão é a espinha dorsal do tratamento de formulários em PHP. Veja PHP Form Handling e PHP Form Validation para o fluxo completo.
Construindo uma URL de redirecionamento
A função header() envia um cabeçalho HTTP bruto — incluindo o cabeçalho Location usado para redirecionamentos. O $_SERVER é útil para construir o destino dinamicamente, por exemplo, forçando HTTPS para a requisição atual:
<?php
// Redirect to the HTTPS version of the same URL when the request is plain HTTP
if (empty($_SERVER['HTTPS'])) {
$url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header('Location: ' . $url, true, 301);
exit;
}header() deve ser chamado antes de qualquer saída (HTML, echo ou mesmo uma linha em branco) ser enviada ao navegador. O comando exit interrompe o script para que nenhum conteúdo adicional seja produzido após o cabeçalho de redirecionamento.
Usando $_SERVER para Tratamento de Erros
Outro uso da variável $_SERVER é para tratamento de erros. Por exemplo, você pode usar o seguinte código para exibir uma página de erro personalizada para erros 404:
Tratamento de erro 404 em PHP com $_SERVER
<?php
// Log the error URI using $_SERVER
error_log('404 Error: ' . $_SERVER['REQUEST_URI']);
http_response_code(404);
include '404.html';
?>Neste exemplo, $_SERVER['REQUEST_URI'] é usado para capturar o caminho solicitado para fins de registro. Em vez de redirecionar, o script define o código de status HTTP correto e inclui um template personalizado, que é a prática padrão para tratamento de erros.
Segurança: não confie em valores controlados pelo cliente
Algumas chaves de $_SERVER vêm da requisição e são totalmente controladas pelo cliente, portanto podem ser falsificadas. Trate-as como entrada não confiável:
HTTP_HOST,HTTP_REFERER,HTTP_USER_AGENTe qualquer outra chaveHTTP_*são apenas cabeçalhos de requisição — um cliente malicioso pode enviar qualquer coisa. Nunca as exiba em HTML sem escapar (usehtmlspecialchars()), e valideHTTP_HOSTcontra uma lista de permissões antes de usá-lo em um redirecionamento.PHP_SELFpode conter dados de caminho injetados e é uma fonte clássica de cross-site scripting (XSS) quando impresso no atributoactionde um formulário. Escape-o.REMOTE_ADDRé o endereço de conexão; atrás de um proxy ou balanceador de carga, o IP real do cliente pode estar em um cabeçalho diferente. Não dependa apenas deREMOTE_ADDRpara decisões de segurança.
Uma forma segura de verificar uma chave ausente sem um aviso é o operador de coalescência nula:
<?php
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
echo $method;Isso evita um aviso de "undefined array key" quando a chave não está definida (por exemplo, ao executar via CLI).
Conclusão
A superglobal $_SERVER dá aos scripts PHP acesso a detalhes da requisição e do ambiente — o método HTTP, a URL solicitada, host, caminhos e o IP do visitante. Ela viabiliza tarefas cotidianas como tratamento de formulários baseado em método, redirecionamentos e registro de erros. Lembre-se apenas que chaves derivadas de cabeçalhos são controladas pelo cliente: valide e escape-as antes do uso.
Para ir além, explore as superglobais relacionadas: $_GET, $_POST e $_REQUEST.
Nota: No PHP moderno, a tag de fechamento ?> é opcional e frequentemente omitida para evitar saída acidental de espaços em branco.