Header Location não funciona quando está online

Olá, fiz uma pagina para mandar email. No servidor local funciona normalmente, mas quando boto ele online ele não redireciona.
Eu hospedei ele no webhost

    <?php
    ob_start();
    session_start();
    include_once("menus/menuGlobal.php");
    echo "<center><img src='images/gif.gif'class='img-responsive' /></center>";
    include_once("rodape.php");
	$nome     = $_POST['nome'];
	$email    = $_POST['email'];
	$mensagem = $_POST['mensagem'];
    $assunto  = $_POST['assunto'];
  
    if(empty($nome)){
        $_SESSION['erro'] = "Campo nome não foi preenchido!";
         header("Location:contatos.php");
    } else if(empty($email)){
        $_SESSION['erro'] = "Campo email não foi preenchido!";
         header("Location:contatos.php");
    } else if(empty($mensagem)){
        $_SESSION['erro'] = "Campo mensagem não foi preenchido!";
         header("Location:contatos.php");
    } else if(empty($assunto)){
        $_SESSION['erro'] = "Campo assuno não foi preenchido!";
         header("Location:contatos.php");
    }

    if((!empty($nome)) && (!empty($email)) && (!empty($mensagem))){

        require 'vendor/autoload.php';

        $from = new SendGrid\Email(null, $email);
        $subject = $assunto;
        $to = new SendGrid\Email(null, "gabrielveigalima@icloud.com");
        $content = new SendGrid\Content("text/html", "<br><br>Nova mensagem de contato pelo site<br><br>Nome: $nome<br>Email: $email <br>Mensagem: $mensagem");
        $mail = new SendGrid\Mail($from, $subject, $to, $content);

        //Necessário inserir a chave 

        $apiKey = '';

        $sg = new \SendGrid($apiKey);

        $response = $sg->client->mail()->send()->post($mail);

        if($response){
            $_SESSION['sucesso'] = "Email enviado com sucesso, em breve estaremos respondendo!";
            header("Location:contatos.php");
        }else{
            $_SESSION['erro'] = "Email não enviado, tente novamente!";
            header("Location:contatos.php");
        }
    }

    header("Location:contatos.php");     
    ob_end_flush(); 
    ?>

`

Estranho funcionar mesmo localmente, pois quando se usa a função header, não se deve imprimir nada antes (echo, print, printf ou html puro por exemplo)…

Recomendo retirar/comentar ou mover a linha do echo center… para baixo de tudo…

Outra prática antiga era colocar um exit logo abaixo de cada header que usa location…

header("Location:contatos.php");
exit;

Isso evitava a continuação das linhas abaixo, não sei como está hoje na versão 7…

Essa linha abaixo do header não faz sentido

ob_end_flush();

Já que após redirecionamento, o php não terá mais controle sobre ela…

Assim como ob_start(); é muito utilizado para downloads de arquivos não para redirecionamentos, sugiro removê-los do seu código, pois são usados para limpeza de buffer (streams), coisa que você não vai usar mandando email…

Já fiz, mas não resolveu.

<?php
        session_start();
        //include_once("menus/menuGlobal.php");
        //echo "<center><img src='images/gif.gif'class='img-responsive' /></center>";
        //include_once("rodape.php");
		$nome     = $_POST['nome'];
		$email    = $_POST['email'];
		$mensagem = $_POST['mensagem'];
        $assunto  = $_POST['assunto'];
      
        if(empty($nome)){
            $_SESSION['erro'] = "Campo nome não foi preenchido!";
             header("Location:contatos.php");
        } else if(empty($email)){
            $_SESSION['erro'] = "Campo email não foi preenchido!";
             header("Location:contatos.php");
        } else if(empty($mensagem)){
            $_SESSION['erro'] = "Campo mensagem não foi preenchido!";
             header("Location:contatos.php");
        } else if(empty($assunto)){
            $_SESSION['erro'] = "Campo assuno não foi preenchido!";
             header("Location:contatos.php");
        }

        if((!empty($nome)) && (!empty($email)) && (!empty($mensagem))){

            require 'vendor/autoload.php';

            $from = new SendGrid\Email(null, $email);
            $subject = $assunto;
            $to = new SendGrid\Email(null, "gabrielveigalima@icloud.com");
            $content = new SendGrid\Content("text/html", "<br><br>Nova mensagem de contato pelo site<br><br>Nome: $nome<br>Email: $email <br>Mensagem: $mensagem");
            $mail = new SendGrid\Mail($from, $subject, $to, $content);

            //Necessário inserir a chave 

            $apiKey = '';

            $sg = new \SendGrid($apiKey);

            $response = $sg->client->mail()->send()->post($mail);

            if($response){
                $_SESSION['sucesso'] = "Email enviado com sucesso, em breve estaremos respondendo!";
                header("Location:contatos.php");
            }else{
                $_SESSION['erro'] = "Email não enviado, tente novamente!";
                header("Location:contatos.php");
            }
        }

        header("Location:contatos.php");   
        exit;
        ?>

Cada header precisa ter seu exit abaixo…

Outra coisa, verifique se não tem algum espaço em branco antes e após os simbolos do php e retire-os…

<?php ... ?>

E por fim, deixe essas diretivas no começo do arquivo só para testar e pegar erros…

<?php
ini_set('display_errors', true);
error_reporting(E_ALL);
...

RESOLVI. O problema era o espaço em branco antes de abrir o php. Obrigado a todos!