Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida sobre header()

Olá, boa tarde,

No curso eu vi o Vinícius falando sobre como o cabeçalho de uma requisição http não pode ser alterado se você exibir alguma coisa, com um "echo" por exemplo, antes de chamar a função "header()". Pra testar esse comportamento eu utilizei o seguinte código:

            echo 'teste';
            $user = $this->userRepository->userByEmail($_POST['email']);
            $correctPassword = password_verify($_POST['senha'], $user->password ?? '');

            if (!$correctPassword) {
                header('Location: /login?erro=1');
            } else {
                header('Location: /login?erro=2');
            }
            header('Location: /login?erro=3');

No meu sistema, pelo menos, não importa se tem "echo" ou não, se tem um ou múltiplos headers, no final o resultado sempre cai no "/login?erro=3" sem ocorrer nenhum erro de execução. Ao meu ver isso parece como se a requisição só fosse enviada realmente ao final de tudo, depois de executar o código inteiro. Devido a isso agora eu estou em dúvida se eu fiz algo de errado, ou se talvez seja alguma configuração do php que está diferente no meu sistema. Se alguém puder esclarecer isso pra mim fico muito agradecido.

2 respostas
solução!

Olá, Julio!

Entendo sua confusão e vou tentar esclarecer essa questão para você. A função header() em PHP é usada para enviar um cabeçalho HTTP bruto. No entanto, é importante lembrar que ela deve ser chamada antes de qualquer saída real ser enviada, seja por tags HTML normais, linhas em branco em um arquivo ou de um comando PHP.

No seu caso, você está chamando a função header() depois de um echo, o que normalmente resultaria em um erro. No entanto, se você não está vendo nenhum erro, é provável que o buffer de saída esteja ativado em seu ambiente PHP. O buffer de saída armazena a saída em um buffer interno antes de enviá-la ao cliente e pode permitir que você chame a função header() após ter enviado saída para o cliente.

Quanto ao comportamento dos múltiplos headers, você está correto. A função header() não interrompe a execução do script. Portanto, mesmo que você chame a função header() para redirecionar para '/login?erro=1' ou '/login?erro=2', o script continuará a ser executado até o final, a menos que você chame exit() ou die() após o header(). Isso significa que, no final, o último cabeçalho enviado será '/login?erro=3', que é o que você está vendo.

Aqui está um exemplo de como você pode alterar seu código para interromper a execução após o redirecionamento:

echo 'teste';
$user = $this->userRepository->userByEmail($_POST['email']);
$correctPassword = password_verify($_POST['senha'], $user->password ?? '');

if (!$correctPassword) {
    header('Location: /login?erro=1');
    exit();
} else {
    header('Location: /login?erro=2');
    exit();
}
header('Location: /login?erro=3');
exit();

Espero ter ajudado e bons estudos!

Oi Matheus, boa tarde,

O problema era o buffer de saída que estava ativado mesmo. Desativei ele no php.ini e agora meu programa funciona de acordo com a descrição do Vinícius.

Muito obrigado!