Deneyimlediğim kadarıyla sonraki satırları çalıştırmayı durdurmalısın, şu sayfaya git deyip sonraki satırda değişkene değer atama yada ne yapıyorsan artık iptal çünkü önceki yönlendirme operasyonunu geçersiz kılıyorsun. Bence en garanti yol exit ile çıkmak, tabi gerek görülürse.

exit(header("Location:login.php"));


Ancak yine edge ve ie'da çalışmıyor bu fonksiyon yada kronik bir sorun var, eski tarayıcıların derdi bitmez. Aşağıdaki şekilde lazım olursa işimi garantiye alıyorum :D


// redirect with delay
public function go($location, $delay = 0, $way = 0){
if (headers_sent() || $way === 0) {
//echo '<script>window.location.href='.$location.'</script>';
echo '';
}
else{
header("Refresh:{$delay}; url={$location}");
}
}