PHP header()
재정의
웹 개발을 할 때 경우에 따라서 서버의 기본 내용을 text, json, xml 등으로 유형을 재정의하여 내보내야 할 때가 있다.
header
header(string $header, bool $replace = true, int $response_code = 0): void
-
string
송신하는 HTTP status 코드를 표시하거나 브라우저를 리다이렉트할 문자열
-
replace
이전에 송신된 비슷한 헤더를 바꿀지 아니면 같은 형식의 두번째 헤더를 추가할지를 지정
header() 함수는 원시 HTTP 헤더를 전송할 수 있다.
그리고 Content-Type 을 추가하여 브라우저에 전송하는 컨텐츠에 대해서 알릴 수 있다.
<?php
// 일반적인 텍스트 문서
header("Content-Type: text/plain");
echo "Hello World";
// Hello World
// JSON
header("Content-Type: application/json");
$data = ["response" => "Hello PHP!"];
echo json_encode($data);
// {"response":"Hello World"}
?>
매개변수
string
-
HTTP status
HTTP status 코드를 표시한다. 문자열 HTTP/로 시작하는 모든 헤더를 말하며 대표적으로 누란된 파일에 대한 요청을 처리하는데 사용된다.
<?php // 404 페이지 에러 header("HTTP/1.1 404 Not Found"); ?>
-
브라우저 리다이렉트
‘Location : 헤더’ 형식으로 쓴다.
<?php header('Location: https://bakcoding.github.io'); ?>
리다이렉트 후 다음 코드는 실행되지 않는다.
replace
선택사항으로 디폴트 값은 true, false 인 경우 같은 타입의 복수 헤더를 강제적으로 생성한다. 즉 헤더가 이전에 송신된 비슷한 헤더를 바꿀지 또는 같은 형식의 두 번째 헤더를 추가할지를 지정한다.
<?php
header("WWW-Authenticate: Negotiate");
header("WWW-Authenticate: NTLM", false);
?>
http_response_code
HTTP response 코드를 강제적으로 지정하며 리턴하지는 않는다.
주의할 점
-
php가 출력을 생성하기 이전에 header() 함수를 호출해야한다. 그렇지 않으면 웹 서버는 이미 헤더를 보냈기 때문에 에러가 발생한다.
-
header의 출력은 서버에서 보낸 첫 번째 바이트여야 한다. 따라서 php 태그가 열리기 전에 공백이나 빈 줄이 없어야 한다.
-
같은 이유로 php만 포함하는 파일이나 파일의 맨 끝에 있는 경우 php 닫기 태그를 생략하는 것이 좋다.
사용예시
강제적으로 캐시 무효화
php 스크립트는 대부분 동적으로 html을 생성하는데 사용한다. 이럴때 서버와 클라이언트 브라우저 사이에 있는 브라우저 캐시나 프록시 캐시에 의해서 캐싱되는것을 방지해야한다.
<?php
header("Cache-Control: no-cache");
header("Pragma:no-cache");
// 또는
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // 과거의 날짜
header("Last-Modified: " . gmdate("D, d M Y H:i:s"); // 항상 변경
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Pragma: no-cache"); //HTTP/1.0
?>
다운로드
사용자에게 데이터를 저장하라는 메시지를 표시하려면 생성된 PDF 파일과 같은 전송은 Content-Disposition 헤더를 사용하여 권장 파일 이름을 제공하고 브라우저에 강제로 저장 다이어로그를 표시한다.
<?php
// 콘텐츠 타입 지정
header('Content-Type: application/pdf');
// 저장시 파일이름
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// 원본 소스 파일
readfile('original.pdf');
?>
다른 포트로 넘기기
기본 포트 80번이 아닌 다른 포트로 넘긴다.
예에서는 8080에 지정된 Web 사이트에 접근한다.
<?php
if ($_SERVER["SERVER_PORT"] == "80") // 코드 최상단
{
header("Location : http://bakcoding.github.io:8080/");
}
?>
charset 변경
<?php
header("Content-Type : text/html; charset=UTF-8");
header("Content-Type : text/html; charset=euc-kr");
?>