prova ad usare il buffering dell'output mettendo all'inizio della pagina ob_start(); in questo modo puoi utilizzare in qualsiasi punto la funzione header();
Per liberare l'output invece devi mettere ob_flush() , o spemplicemente aspettare [millisecondi] che l'intermprete arrivi al fondo della pagina, liberando tutto insieme in automatico l'html bufferizzato!