문제: header() 호출 전에 출력이 발생하여 리다이렉트 실패
해결책:
<?php
// 파일 최상단에 출력 버퍼링 시작
ob_start();
// 로그인 처리
if ($_POST['username'] && $_POST['password']) {
if (validateLogin($_POST['username'], $_POST['password'])) {
$_SESSION['user_id'] = getUserId($_POST['username']);
// 버퍼 정리 후 리다이렉트
ob_end_clean();
header('Location: dashboard.php');
exit();
}
}
// 버퍼 출력
ob_end_flush();
?>
문제: header() 후 스크립트가 계속 실행되어 리다이렉트 무효화
해결책:
function redirectTo($url) {
header("Location: $url");
exit(); // 반드시 필요!
}
// 로그인 성공 시
if (loginSuccess()) {
$_SESSION['logged_in'] = true;
redirectTo('dashboard.php'); // exit() 포함된 함수 사용
}
// 또는 직접 사용
header('Location: welcome.php');
die(); // exit()와 동일
문제: 잘못된 경로로 인한 리다이렉트 실패
해결책:
// 절대 URL 생성 함수
function getAbsoluteUrl($path) {
$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
return $protocol . '://' . $host . '/' . ltrim($path, '/');
}
// 로그인 후 리다이렉트
if (loginValid()) {
$redirectUrl = getAbsoluteUrl('user/dashboard.php');
header("Location: $redirectUrl");
exit();
}
// 또는 간단한 방법
$baseUrl = (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'];
header("Location: $baseUrl/dashboard.php");
exit();
문제: 로그인 후 원래 접근하려던 페이지로 돌아가지 못함
해결책:
// 로그인 폼 페이지에서 이전 URL 저장
if (!isset($_SESSION['redirect_after_login']) && isset($_SERVER['HTTP_REFERER'])) {
$_SESSION['redirect_after_login'] = $_SERVER['HTTP_REFERER'];
}
// 로그인 처리
if (processLogin()) {
$redirectUrl = $_SESSION['redirect_after_login'] ?? 'dashboard.php';
unset($_SESSION['redirect_after_login']);
header("Location: $redirectUrl");
exit();
}
// URL 매개변수로 리다이렉트 URL 전달
$returnUrl = $_GET['return'] ?? 'dashboard.php';
if (loginSuccess()) {
header("Location: " . urldecode($returnUrl));
exit();
}
문제: AJAX 요청에서는 header() 리다이렉트가 작동하지 않음
해결책:
// AJAX 로그인 처리
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_SERVER['HTTP_X_REQUESTED_WITH'])) {
$response = ['success' => false];
if (validateLogin($_POST['username'], $_POST['password'])) {
$_SESSION['user_id'] = getUserId($_POST['username']);
$response = [
'success' => true,
'redirect' => 'dashboard.php'
];
}
header('Content-Type: application/json');
echo json_encode($response);
exit();
}
JavaScript 측:
// AJAX 로그인 요청
fetch('login.php', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
window.location.href = data.redirect;
}
});
문제: 브라우저 캐시로 인해 리다이렉트가 무시됨
해결책:
// 캐시 방지 헤더와 함께 리다이렉트
function redirectWithNoCache($url) {
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
header("Location: $url");
exit();
}
// 로그인 후 사용
if (loginSuccess()) {
redirectWithNoCache('dashboard.php');
}
문제: 세션이 시작되지 않아 로그인 상태 저장 실패
해결책:
// 세션 상태 확인 후 시작
function ensureSessionStarted() {
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
}
// 로그인 처리 전 세션 확인
ensureSessionStarted();
if (validateCredentials($_POST['username'], $_POST['password'])) {
$_SESSION['user_id'] = getUserId($_POST['username']);
$_SESSION['login_time'] = time();
header('Location: dashboard.php');
exit();
}
문제: 사용자 역할에 따른 다른 페이지 리다이렉트 필요
해결책:
function getRedirectUrl($userId) {
$userRole = getUserRole($userId);
switch ($userRole) {
case 'admin':
return 'admin/dashboard.php';
case 'manager':
return 'manager/panel.php';
case 'user':
default:
return 'user/home.php';
}
}
// 로그인 성공 후
if (loginSuccess()) {
$userId = $_SESSION['user_id'];
$redirectUrl = getRedirectUrl($userId);
header("Location: $redirectUrl");
exit();
}
문제: 리다이렉트 실패 원인 파악 어려움
해결책:
function debugRedirect($url, $reason = '') {
$logMessage = date('Y-m-d H:i:s') . " - Redirect to: $url";
if ($reason) {
$logMessage .= " (Reason: $reason)";
}
error_log($logMessage, 3, '/tmp/redirect.log');
header("Location: $url");
exit();
}
// 사용 예시
if (loginSuccess()) {
debugRedirect('dashboard.php', 'Login successful');
}