esto ya se a tratado muchas veces, el header no funciona si ya se ha enviado información al navegador, es decir, el header intenta modificar el contenido dentro del tag head y si este ya esta en la maquina del cliente es imposible que pueda hacerlo, para que este funciones es necesario que todo el código este en el servidor y para ella puedes usar las funciones
ob_start() y
ob_end_flush() o de lo contradio no mostrar nada en pantalla, no print, no echo y no codigo html puro.