Introdução: por que o redirecionamento em PHP não é apenas header('Location:')
\n\nTodo 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.
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\nNeste 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\nErro nº1: Redirecionamento após exibição de conteúdo (Header already sent)
\n\nQual é o problema
\nO 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».
Por que isso acontece?
\nO 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.
Exemplo do erro
\n<?php\necho "Olá!";\nheader('Location: /painel.php'); // ERRO: cabeçalhos já foram enviados\n?>\n\nComo 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
<?phpou depois de?>\n - Regra nº3: use o buffer de saída se não for possível evitar a exibição antecipada \n
<?php\n// Correto: redirecionamento antes de qualquer saída\nheader('Location: /painel.php');\nexit;\n?>\n\nBuffer 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\nErro nº2: Esquecer o exit (ou die) após o redirecionamento
\n\nQual é o problema
\nChamar 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?
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\nComo corrigir
\nSempre use exit (ou die) imediatamente após chamar header(). Isso garante que o script seja encerrado e nenhum código extra seja executado.
<?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\nErro nº3: URL incorreta (caminhos relativos vs absolutos)
\n\nQual é o problema
\nO padrão HTTP exige que o valor do cabeçalho Location se