header란 기본적으로 원시(raw) HTTP헤더를 보내는 것이다.
header() 는 일반 HTML 태그, 파일의 빈 줄 또는 PHP에서 실제 출력을 보내기 전에 호출해야 한다.
include 또는 require 함수 또는 다른 파일 액세스 함수를 사용하여 코드를 읽고 header() 가 호출 되기 전에 공백이나 빈 줄이 있어서 오류가 나는 경우가 많다.
단일 PHP/HTML 파일을 사용할 때도 동일한 문제가 발생할 수 있다.
header(string $header, bool $replace = true, int $response_code = 0): void
위 코드는 header 함수의 형태고 반환되는 값은 없다.
보낼 헤더를 예약하는데 실패하는 경우, header()는 E_WARNING 수준의 에러를 일으킨다.
header 변수는 헤더 문자열로 두 가지 경우에 쓰인다.
첫 번째 경우는 보낼 HTTP 상태 코드를 파악하는 데 사용되는 문자열 "HTTP/"(대소문자는 중요하지 않음)로 시작하는 헤더를 보낼 때 사용한다.
header("HTTP/1.1 404 Not Found");
두 번째 경우는 "Location:"을 사용할 때의 헤더이다. 이 헤더는 브라우저로 다시 보낼 때 뿐만 아니라 201 또는 3xx 상태 코드가 이미 설정되어 있지 않은 경우 브라우저에 REDIRECT(302) 상태 코드를 반환한다.
header("Location: http://www.example.com/");
선택으로 사용되는 replace매개변수는 헤더가 이전의 유사한 헤더를 대체 할지 또는 동일한 유형의 두 번째 헤더를 추가할지를 나타낸다.
기본적으로 대체되지만 두 번째 인수로 false 값을 전달하면 동일한 유형의헤더들을 강제적으로 추가할 수 있다.
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
HTTP 응답 코드를 지정된 값으로 강제 실행한다.
이 매개변수는 header가 비어 있지 않은 경우에만 적용할 수 있다.
// We'll be outputting a PDF
header('Content-Type: application/pdf');
request에 실어 보내는 body 데이터의 type 정보이다.(어떻게 문서가 파싱해야하는지)
리소스의 media type을 나타내기 위해 사용한다.
type/subtype 형태로 사용한다. (ex. text/css 텍스트 파일인 css파일)
뒤에 charset= 을 사용해 인코딩을 알려주기도 한다.
header('Content-Disposition: attachment; filename="downloaded.pdf"');
실제로 파일명을 지정함으로서 더 자세한 파일의 속성을 알려준다.
: attachment
브라우저 인식 파일확장자를 포함하여 모든 확장자의 파일들에 대해, 다운로드 시 무조건 파일 다운로드 대화상자를 표시하는 헤드 속성
: inline
브라우저 인식 파일확장자를 가진 파일들에 대해서는 웹브라우저에서 바로 파일을 열고, 그 외는 파일다운로드 대화상자를 표시하는 헤드 속성
header('Content-Transfer-Encoding: binary');
사용자에게 entity를 안전하게 전송하기 위해 사용하는 인코딩 형식을 지정한다.
header("Content-Length: ".$size);
요청 또는 응답 본문에 있는 데이터 바이트 수를 알려준다.(단순하게 업로드한 파일 크기)
header('Cache-Control: private, no-transform, no-store, must-revalidate');
반 헤더 필드는 요청과 응답 내의 캐싱 메커니즘을 위한 디렉티브를 정하기 위해 사용한다.
public
응답이 어떤 캐시에 의해서든 캐시된다는 것을 나타낸다.
private
응답이 단일 사용자를 위한 것이며 공유 캐시에 의해 저장되지 않아야 한다. 사설 캐시는 응답을 저장할 수도 있다.
no-cache
캐시된 복사본을 사용자에게 보여주기 이전에, 재검증을 위한 요청을 원 서버로 보내도록 강제한다.
only-if-cached
새로운 데이터를 내려받지 않음을 나타낸다. 클라이언트는 캐시된 응답만을 원하며, 더 최신 복사본이 존재하는지를 알아보기 위해 서버에 요청해선 안된다.
must-revalidate
캐시는 사용하기 이전에 기존 리소스의 상태를 반드시 확인해야 하며 만료된 리소스는 사용되어서는 안된다.
proxy-revalidate
기본적으로 must-revalidate와 동일하지만, (프록시와 같은)공유 캐시에만 적용되며 사설 캐시에 의해서는 무시된다.
immutable
응답 본문이 계속해서 변하지 않을 것이라는 것을 나타낸다.
응답이 만료되지 않아서 서버 상에서 변경되지 않는다면 클라이언트는 업데이트 검사를 위해 (If-None-Match 혹은 If-Modified-Since과 같은)그에 대한 조건부의 재검증을 전송해서는 안 된다. 이 확장을 감지하지못한 클라이언트는 HTTP 명세에 따라 검사를 무시해야만 한다.
파이어폭스에서 immutable는 https:// 트랜잭션 상에서만 부여된다.
no-store
캐시는 클라이언트 요청 혹은 서버 응답에 관해서 어떤 것도 저장해서는 안된다.
no-transform
응답에 대해 변형이나 변환이 일어나서는 안된다.
Content-Encoding, Content-Range, Content-Type 헤더는 프록시에 의해서 수정되어서는 안된다.
header("Pragma: no-cache");
요청-응답 체인에 다양한 영향을 줄 수 있는 구현관련 헤더이다.
Cache-Control 헤더가 생기기 전에 동일한 역할을 하는 대용 헤더로 사용되었다.
header('Expires: 0');
header('Expires: wed, 25 Oct 2022 04:00:00 GMT');
응답을 받지 않을 날짜를 설정한다.
0과 같은 유효하지 않은 날짜는 과거의 시간을 나타내어 리소스가 이미 만료되었음을 의미한다.
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
브라우저가 서버로 요청한 파일의 최종 수정 시간을 알려주는 헤더이다.
If-Modified-Since 헤더로 서버가 수정여부를 알려준다
기능은 위에서 설명한 그대로다.
참고할 점은 대부분의 최신 클라이언트는 Location: 에 대한 인수로 상대 URI 를 허용 하지만 일부 이전 클라이언트에는 스키마, 호스트 이름 및 절대 경로를 포함하는 절대 URI가 필요하다. 일반적으로 $_SERVER['HTTP_HOST'] , $_SERVER['PHP_SELF'] 및 dirname() 을 사용하여 상대 URI에서 절대 URI를 만들 수 있다.