Redirecionamento em PHP: 5 erros fatais e como evitá-los

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que o redirecionamento em PHP não é apenas header('Location:')

\n\n

Todo mundo que já programou em PHP já precisou redirecionar um usuário para outra página. Parece simples, não é? Uma linha header('Location: /nova-pagina'); e pronto. Mas, na prática, esse mecanismo simples se torna uma dor de cabeça para milhares de desenvolvedores. Não é à toa que a pergunta «How do I make a redirect in PHP?» no Stack Overflow tem milhões de visualizações.

\n\n

O problema é que o redirecionamento em PHP não é apenas chamar uma função, mas um processo inteiro que pode ser facilmente quebrado. Você já viu o erro «Cannot modify header information»? Ou percebeu que o redirect funciona, mas a página ainda carrega? Ou, pior ainda, já enfrentou um redirect que simplesmente não funciona e o usuário vê uma página em branco?

\n\n

Neste artigo, vamos analisar os 5 erros mais comuns ao criar um redirecionamento em PHP, aprender a corrigi-los e descobrir como fazer um redirect seguro e previsível. Vamos lá!

\n\n

Erro nº1: Redirecionamento após exibição de conteúdo (Header already sent)

\n\n

Qual é o problema

\n

O erro mais comum entre iniciantes é tentar enviar o cabeçalho HTTP Location depois que o navegador já recebeu HTML ou até mesmo um espaço em branco. O PHP exibe um erro fatal: «Cannot modify header information - headers already sent».

\n\n

Por que isso acontece?

\n

O protocolo HTTP exige que os cabeçalhos sejam enviados estritamente antes do corpo da resposta. Assim que o PHP exibe algo na tela (via echo, print, ou até mesmo uma linha em branco antes de <?php), os cabeçalhos já estão definidos. Não é mais possível alterá-los.

\n\n

Exemplo do erro

\n
<?php\necho "Olá!";\nheader('Location: /painel.php'); // ERRO: cabeçalhos já foram enviados\n?>
\n\n

Como corrigir

\n
    \n
  • Regra nº1: chame header() antes de qualquer saída, incluindo espaços e HTML
  • \n
  • Regra nº2: certifique-se de que seu arquivo PHP não tenha espaços ou linhas em branco antes de <?php ou depois de ?>
  • \n
  • Regra nº3: use o buffer de saída se não for possível evitar a exibição antecipada
  • \n
\n\n
<?php\n// Correto: redirecionamento antes de qualquer saída\nheader('Location: /painel.php');\nexit;\n?>
\n\n

Buffer de saída (método avançado):

\n
<?php\nob_start(); // Ativa o buffer\necho "Conteúdo temporário";\nheader('Location: /painel.php');\nob_end_flush(); // Envia tudo de uma vez\nexit;\n?>
\n\n

Erro nº2: Esquecer o exit (ou die) após o redirecionamento

\n\n

Qual é o problema

\n

Chamar header('Location: ...') não interrompe automaticamente a execução do script. O PHP continua processando o código, enquanto o navegador, ao receber o cabeçalho, começa a carregar a nova página. Mas e se, após o redirect, houver um código pesado ou, pior ainda, um código que altera dados no banco?

\n\n

Exemplo do erro

\n
<?php\nheader('Location: /sucesso.php');\n// O usuário já foi redirecionado, mas o PHP continua!\natualizar_saldo($usuarioId, -1000); // PERIGOSO: débito na conta\nenviar_email_admin("Usuário realizou uma compra");\n?>
\n\n

Como corrigir

\n

Sempre use exit (ou die) imediatamente após chamar header(). Isso garante que o script seja encerrado e nenhum código extra seja executado.

\n\n
<?php\nheader('Location: /sucesso.php');\nexit; // Interrompe o script completamente\n// O código abaixo não será executado\natualizar_saldo($usuarioId, -1000);\n?>
\n\n

Erro nº3: URL incorreta (caminhos relativos vs absolutos)

\n\n

Qual é o problema

\n

O padrão HTTP exige que o valor do cabeçalho Location se

Blogs

Book Recommendations