W3docs

$_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

ChaveO 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_AGENT e qualquer outra chave HTTP_* são apenas cabeçalhos de requisição — um cliente malicioso pode enviar qualquer coisa. Nunca as exiba em HTML sem escapar (use htmlspecialchars()), e valide HTTP_HOST contra uma lista de permissões antes de usá-lo em um redirecionamento.
  • PHP_SELF pode conter dados de caminho injetados e é uma fonte clássica de cross-site scripting (XSS) quando impresso no atributo action de 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 de REMOTE_ADDR para 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.

Prática

Prática
Que informações a superglobal PHP $_SERVER pode fornecer?
Que informações a superglobal PHP $_SERVER pode fornecer?
Was this page helpful?