vamos a ver, el error se produce cuando intentas modificar o enviar una cabecera HTTP después de haber enviado datos, es decir:
Breve introducción a HTTP
La comunicación entre un servidor y un cliente web usa el protocolo HTTP como estándar (puede no ser así, pero es poco común).
El servidor necesita enviar información al cliente para que manipule el contenido de una forma u otra, esta información va e una parte de la comunicación que se llama Header (cabecera), en el header se incluye también información relativa a las Cookies y/o cualquier modificación con la función header () de php (entre otras funciones)
Después de entregar esta información envía el contenido que se busca, en nuestro caso el código HTML (también puede enviar texto sin formato o otro tipo de archivos).
Siempre en ese orden:
Servidor - Cliente
[Header fields]
[Content] (normal mente)
Antes de enviar cualquier contenido (HTML) el servidor ("Apache-PHP", por ejemplo) envía las cabeceras, para seguir el protocolo, una vez enviadas no se pueden modificar (como es obvio), tampoco se pueden añadir otras cabeceras, como es tu caso.
La mejor solución ante este problema es guardar cualquier salida ("echo") en alguna variable, y que lo último que salga sea tal contenido.
Por esto no es recomendable mezclar HTML con PHP:
Código PHP:
<!-- En este punto ya han sido enviadas las cabeceras -->
<html>
<head>
<title>Algo</title>
</head>
<body>
<?php echo $body;?><!-- esta no solo no es una buena forma sino que además
resulta sucia y difícil de mantener -->
</body>
</html>