Ten en cuenta que si tu construyes tu página usando include de otros scripts, esos scripts que incluyas tampoco deben de devolver ninguna salida al navegador antes de lanzar header...
Y ten en cuenta tb que no sólo la función header da errores de headers already sent, si por ejemplo usas setcookie o session_start() habiendo enviado salida al navegador tb te dará ese error.
Solución revisar que no haya salida al navegador antes de header, setcookie session_start
O usar buffer de la página
Al inicio de la página
Código PHP:
<?
ob_start();
?>
Y al final
Código PHP:
<?
ob_end_flush();
?>
Y cuando digo al inicio de la página, me refiero a que si tienes la función header en un script que incluyes en tu página(con un include), no valdría con poner este código en ése script, sino que hay que ponerlo en el script principal y antes de cualquier cosa.
Lo digo porque a veces la gente se equivoca con eso...
Las cabeceras se envian automáticamente.
Pero no es ese el problema...
La cosa está básicamente en que si tu tienes alguna salida antes de una función que requiere modificar las cabeceras, esa salida, requiere también que se envien unas cabeceras...
Y como php interpreta línea a línea, si en la línea 1 encuentra que ha de mandar algo a la salida del navegador, pués entonces envia antes las cabeceras.
Si luego en la línea 5 le pides que modifique las cabeceras que ya ha enviado previamente, pues te da error.
Y la solución de usar el buffer, lo explica perfectamente, digamos que toda la salida al navegador se guarda en el buffer, sólo envia una vez las cabeceras que proceda y por tanto puede poner en la cabecera las peticions necesarias para redireccionar.
Más o menos es eso...
Salu2 ;)