Ce n'est pas seulement les blancs qui peuvent poser problème, c'est toute donnée qui est envoyée au client avant l'utilisation de session_start().
Petit rappel de fonctionnement du protocole HTTP. Quand deux machines échangent des données en HTTP, chaque échange commence par un envoi d'entête donnant des informations sur le document qui est envoyé (son type mime, sa langue, son jeu de caractères, etc). Ces entêtes ne doivent être envoyés qu'une seule fois par échange.
La fonction PHP session_start() envoie des entêtes au client, notamment pour indiquer au client de créer un cookie de session. Seulement, si avant cette fonction tu envoies d'autres données, le serveur va automatiquement envoyer des entêtes par défaut (car chaque échange doit débuter par des entêtes). Du coup, ton serveur envoie des entêtes, puis les quelques données qui se trouvent avant ta fonction session_start(), et quand il tombe sur session_start() il va vouloir envoyer à nouveau des entêtes. Et c'est là que tu te manges le poétique message d'erreur que tu donnes.
Ces données qui provoquent l'envoi des entêtes par défaut peuvent être de simples chaînes de caractères envoyées avec "print" ou "echo", ou par l'intermédiaire d'une fonction. Ca peut aussi être des espaces blancs, des tabulations ou des retours à la ligne qui sont présent dans le fichier PHP avant l'ouverture de la balise "<?php".
Voilà quelques exemples qui peuvent provoquer cette erreur.
D'abord le cas classique : une chaîne de caractère est envoyé au client, donc avec des entêtes, puis l'appel à session_start() provoque l'erreur car session_start() envoie à nouveau des entêtes.
Bloc de code:
<?php
echo "hello world";
session_start();
...
?>
Plus subtil : avant l'ouverture de la balise PHP, il y a un retour à la ligne. Ce caractère est envoyé au client, ce qui oblige le serveur à envoyer des entêtes. Puis, dans le script PHP, l'appel à session_start() envoie de nouveau des entêtes : erreur.
Bloc de code:
<?php
session_start();
...
?>
Enfin, autre cas : une fonction qui envoie des données au client est appelée avant session_start(), et on a donc à peu près le même cas de figure que dans le premier exemple.
Bloc de code:
<?php
function foo() {
print "hello world";
}
foo();
session_start();
...
?>
Dans ton cas, tu as vraisemblement des données qui sont donc envoyées au client avant l'appel à session_start(). Vérifie bien tout le code que tu as avant ton session_start() (appels de fonctions, d'include, etc.).