PHP header 함수 사용하기

신주형·2023년 1월 25일
0

PHP

목록 보기
2/2
post-thumbnail

header 함수

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

header 변수는 헤더 문자열로 두 가지 경우에 쓰인다.

첫 번째 경우는 보낼 HTTP 상태 코드를 파악하는 데 사용되는 문자열 "HTTP/"(대소문자는 중요하지 않음)로 시작하는 헤더를 보낼 때 사용한다.

header("HTTP/1.1 404 Not Found");

두 번째 경우는 "Location:"을 사용할 때의 헤더이다. 이 헤더는 브라우저로 다시 보낼 때 뿐만 아니라 201 또는 3xx 상태 코드가 이미 설정되어 있지 않은 경우 브라우저에 REDIRECT(302) 상태 코드를 반환한다.

header("Location: http://www.example.com/");

- $replace

선택으로 사용되는 replace매개변수는 헤더가 이전의 유사한 헤더를 대체 할지 또는 동일한 유형의 두 번째 헤더를 추가할지를 나타낸다.
기본적으로 대체되지만 두 번째 인수로 false 값을 전달하면 동일한 유형의헤더들을 강제적으로 추가할 수 있다.

header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);

- $response_code

HTTP 응답 코드를 지정된 값으로 강제 실행한다.
이 매개변수는 header가 비어 있지 않은 경우에만 적용할 수 있다.

header 함수를 사용하는 예


Content-Type

// We'll be outputting a PDF
header('Content-Type: application/pdf');

request에 실어 보내는 body 데이터의 type 정보이다.(어떻게 문서가 파싱해야하는지)
리소스의 media type을 나타내기 위해 사용한다.
type/subtype 형태로 사용한다. (ex. text/css 텍스트 파일인 css파일)
뒤에 charset= 을 사용해 인코딩을 알려주기도 한다.

Content-Disposition

header('Content-Disposition: attachment; filename="downloaded.pdf"');

실제로 파일명을 지정함으로서 더 자세한 파일의 속성을 알려준다.

  • : attachment
    브라우저 인식 파일확장자를 포함하여 모든 확장자의 파일들에 대해, 다운로드 시 무조건 파일 다운로드 대화상자를 표시하는 헤드 속성

  • : inline
    브라우저 인식 파일확장자를 가진 파일들에 대해서는 웹브라우저에서 바로 파일을 열고, 그 외는 파일다운로드 대화상자를 표시하는 헤드 속성

Content-Transfer-Encoding

header('Content-Transfer-Encoding: binary');

사용자에게 entity를 안전하게 전송하기 위해 사용하는 인코딩 형식을 지정한다.

Content-Length

header("Content-Length: ".$size);

요청 또는 응답 본문에 있는 데이터 바이트 수를 알려준다.(단순하게 업로드한 파일 크기)

Cache-Control

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 헤더는 프록시에 의해서 수정되어서는 안된다.

Pragma

header("Pragma: no-cache");

요청-응답 체인에 다양한 영향을 줄 수 있는 구현관련 헤더이다.
Cache-Control 헤더가 생기기 전에 동일한 역할을 하는 대용 헤더로 사용되었다.

  • no-cache
    Cache-Control: no-cache 와 같다. 캐시가 캐시 복사본을 공개 하기전에 원격 서버로 요청을 날려 유효성 검사를 강제하도록 한다.

Expires

header('Expires: 0');
header('Expires: wed, 25 Oct 2022 04:00:00 GMT');

응답을 받지 않을 날짜를 설정한다.
0과 같은 유효하지 않은 날짜는 과거의 시간을 나타내어 리소스가 이미 만료되었음을 의미한다.

Last-Modified

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

브라우저가 서버로 요청한 파일의 최종 수정 시간을 알려주는 헤더이다.
If-Modified-Since 헤더로 서버가 수정여부를 알려준다

Location

기능은 위에서 설명한 그대로다.
참고할 점은 대부분의 최신 클라이언트는 Location: 에 대한 인수로 상대 URI 를 허용 하지만 일부 이전 클라이언트에는 스키마, 호스트 이름 및 절대 경로를 포함하는 절대 URI가 필요하다. 일반적으로 $_SERVER['HTTP_HOST'] , $_SERVER['PHP_SELF'] 및 dirname() 을 사용하여 상대 URI에서 절대 URI를 만들 수 있다.

0개의 댓글