PHP에서 HTTP 응답 헤더 문제
HTTP 규칙에 따르면 먼저
HTTP 헤더가 전송된 후 HTTP 응답 본문이 전송됩니다.
이로 인해 PHP의 header
함수를 사용할 때 몇 가지 특별한 점이 있습니다.
문제는 이 함수를 호출하기 전에
화면에 어떤 출력이 있으면,
그것이 응답 본문의 시작으로 해석된다는 점입니다.
이 경우
header 함수를 호출하면
PHP에서 headers already sent라는
경고 메시지가 나타납니다.
이때 헤더는 전송될 수도 있습니다.
심지어 오류가 출력되지 않을 수도 있습니다(PHP 설정에 따라 다름).
하지만 대부분의 경우 이는 로컬 환경에서만 그럴 뿐,
사이트를 인터넷에 배포하면
모든 것이 망가질 것입니다.
화면 출력이란 어떤 텍스트든 의미합니다. 예를 들어 다음과 같습니다:
text
<?php
header('Content-Type: text/html');
?>
또는 빈 줄:
<?php
header('Content-Type: text/html');
?>
또는 공백:
<?php
header('Content-Type: text/html');
?>
또는 태그:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
또는 echo를 통한 출력:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
또는 var_dump를 통한 출력:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
심지어 PHP 경고도 화면 출력이 됩니다. 다음 예제에서는 의도적으로 존재하지 않는 변수에 접근하여 경고를 출력하게 합니다:
<?php
$text += 1;
header('Content-Type: text/html');
?>
PHP 태그의 분리도 화면 출력을 발생시킵니다:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
의도적으로 header 함수 앞에
화면 출력을 만들어 보세요.
발생하는 오류 메시지를 살펴보세요.
다음 코드에서 발생한 오류를 수정하세요:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>