Ok... primero hay que entender lo que se esta haciendo.
Todo el código HTML que se pretende mostrar
debe ir dentro del <body></body>. Puedes hacer esto:
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<!-- Sólo si el usuario no ha iniciado sesión se muestra el formulario de ingreso -->
<?php if( ! isset( $_SESSION['logged_in'] ) || $_SESSION['logged_in'] === false ) : ?>
<form action="login.php" method="get">
<input type="text" name="user" />
<input type="password" name="pass" />
<input type="submit" name="submitBtn" />
</form>
<?php else : ?>
<!-- De lo contrario se muestra un div con la información básica del usuario -->
<div id="logged-in">
<p>Usuario: <?php echo ucwords( $_SESSION['user_name'] ); ?></p>
<p><a href="logout.php">Salir</a>
</div>
<?php endif; ?>
<?php if( isset( $_GET['msg' ] ) ) : ?>
<div class="error-msg"><!-- Aquí muestras los posibles errores -->
<p><?php echo $_GET['msg']; ?></p>
</div>
<?php endif; ?>
</body>
</html>
Luego, en los archivos login.php y logout.php:
login.php<?php
session_start();
$out = '';
$headto = 'index.php'; // Originalmente, te redirigirá a la página de inicio.
if( ! isset( $_GET['submitBtn'] ) ) { // Esto sirve si es que por algún motivo se ingresó la URL tusitioweb.algo/login.php, de lo contrario cualquier podría iniciar sesión.
if( isset( $_GET['user'] ) && ! empty( $_GET['user'] ) &&
isset( $_GET['pass'] ) && ! empty( $_GET['pass'] ) ) {
$user = filter_var( $_GET['user'], FILTER_SANTIZE_STRING ); // Limpiar la variable para prevenir inyección de código.
$pass = $_GET['pass'];
include_once "configuracion.php";
$con = mysql_connect( $dbhost, $dbuser, $dbpass ); // Sin comillas. Usa comillas sólo para envolver palabras, no variables.
mysql_select_db( $db, $con );
$query = "SELECT * FROM usuarios WHERE nick = '$user'";
$result = mysql_query( $query, $con );
if( mysql_num_rows( $result ) == 1 ) { // Si se devolvió una fila, entonces el usuario existe
$assoc = mysql_fetch_assoc( $result );
if( $pass == $assoc['contrasena'] ) {
$_SESSION['logged_in'] = true;
$_SESSION['user_name'] = $assoc['nick'];
} else {
$out .= 'Contraseña incorrecta';
}
} else { // Si se devolvieron 0 o más de una fila, entonces el usuario no existe o la tabla esta mal hecha.
$headto = 'registrar.php'; // El usuario no existe, entonces se envía a la página de registro.
}
mysql_free_result( $result );
mysql_close( $con );
} else {
$out .= "Ingrese una contraseña y un usuario válidos.";
}
}
if( ! empty( $out ) )
$headto .= '?msg=' . urlencode( $out );
header( "Location: $headto" );
?>
De esta forma no necesitas tener varios header(), solo una variable que contenga la URL a la que redirigir.
logout.php<?php
session_start();
$headto = 'index.php';
$_SESSION = array();
session_destroy();
header( "Location: $headto" );
?>
Eso es todo en cuanto a la "salida" del usuario.
En cuanto al registro de usuarios, no utilices session_start() ni setcookie(), simplemente redirige al usuario a la página de inicio de sesión con los datos que acabas de ingresar:
header( "Location: login.php?user_name=nombre_usuario&pass=********" ); // Así se pasan los valores al arreglo $_GET