В первом случае вы пытаетесь вывести header location
после того, как уже вывели какой-то html-код.
То есть заголовки уже отправлены, а то что внутри HTML уже не может называться заголовками.
Во втором случае вы выводите содержимое file.php еще
до
Естественно, страница "ломается".
Можно переделать как-то так:
<?php
// непонятно откуда вообще взялся $user, но пускай
if ($user->ban){
unset ($_SESSION['auth']);
header('location: /banned');
exit;
} elseif (!$_SESSION['auth']) {
header('location: /auth');
exit;
}
?>
<!doctype html>
<html> // бла-бла-бла
и только там где-то внутри html
if(всё ок) {
require 'file.php';
}
Но как только нормально разберетесь как это все работает можно прекращать этот цирк и читать про шаблонизаторы и роутинг.