Vorrei far firmare una petizione per evitare di suggerire la funzione ob_start() quando la gente chiede a proposito dell'errore "header already sent".
Penso sia l'errore più banale al mondo da correggere, ovvero basta sapere che la funzione header() funziona solamente se ancora nessun header è stato inviato. In due parole prima della funzione header() lo script non deve scrivere output di nessun genere (e questo include anche i messaggi di errore). Quindi niente echo, print(), var_dump() prima di header(), e se ci sono errori di natura diversa, correggeteli e vedrete che tutto funzionerà.