Il problema dovrebbe essere legato al fatto che, nel chiamare header('Location..., i dati di sessione non possono essere recuperati dal cookie nella nuova pagina. Per ovviare prova con

codice:
header('Location: protetta.php?'.SID);
Il fatto che puntando direttamente la pagina ti compia la parte protetta è perchè comunque la sessione è stata aggiornata correttamente ma nell'immediato del redirect non è accessibile.