php HTTP header 함수 관련 설명 > PHP

STUDY ROOM

PHP

php HTTP header 함수 관련 설명

페이지 정보

작성자 JMStudy 작성일05-07-06 10:37 조회7,121회 댓글0건

본문

void header ( string string [, bool replace [, int http_response_code]])

header()은 raw HTTP 헤더를 전송하기 위해 사용합니다. HTTP 헤더에 관한 자세한 정보는 HTTP/1.1 규격을 참고하십시오.

선택적인 replace 인자는 이전의 동일한 헤더를 교체할지, 혹은 같은 형의 두번째 헤더로 덧붙일 것일지를 지시합니다. 기본값은 교체이지만, 두번째 인자로 FALSE를 넘겨서 같은 형을 가지는 복수의 헤더를 지시할 수 있습니다. 예를 들면:

<?php
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', false);
?>

두번째 선택적인 http_resopnse_code는 HTTP 응답 코드를 지정한 값으로 강제합니다. (이 인자는 PHP 4.3.0 이상에서 사용할 수 있습니다)

두가지 특별한 헤더 호출이 존재합니다. 첫번째는 문자열 "HTTP/"(대소문자 구별 없음)으로 시작하는, HTTP 상태 코드를 출력하기 위해 사용하는 헤더입니다. 예를 들어, 아파치에서 존재하지 않는 파일들에 대한 요청을 (ErrorDocument 지시어를 사용하여) PHP 스크립트로 처리하게 했다면, 스크립트가 정확한 상태 코드를 출력하도록 할 수 있습니다.

<?php
header("HTTP/1.0 404 Not Found");
?>

참고: header() 호출이 처음이건 아니건에 관계 없이, HTTP 상태 헤더줄은 클라이언트에게 항상 처음으로 전송해야 합니다. HTTP 헤더가 전송되기 전에는 어떤 때라도 header()을 호출하여 상태를 덮어쓸 수 있습니다.

참고: PHP 3에서, 이 방법은 PHP를 아파치 모듈로 컴파일 했을 때만 작동했습니다. Status 헤더를 이용하여 같은 효과를 얻을 수 있습니다.

<?php
header("Status: 404 Not Found");
?>

두번째 특별한 경우는 "Location:" 헤더입니다. 이 헤더만을 전송할 뿐이 아니라, 이전에 3xx 상태 코드를 설정하지 않았다면 REDIERCT (302) 상태 코드를 브라우저에 반환합니다.

<?php
header("Location: http://www.example.com/"); /* 브라우저 리다이렉트 */
/* 이 아래의 코드는 리다이렉트 되었을때는 실행되지 않습니다. */
exit;
?>

참고: HTTP/1.1은 Location:의 인자로 scheme, hostname, 절대 경로를 포함하는 절대 URI를 요구하고 있지만, 일부 클라이언트는 상대 URI도 받아들입니다. 일반적으로 $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'], dirname()을 사용하여 상대 경로에서 절대 경로를 만들 수 있습니다:

<?php
header("Location: http://".$_SERVER['HTTP_HOST']
. dirname($_SERVER['PHP_SELF'])
. "/" . $relative_url);
?>

PHP 스크립트는 종종 서버와 클라이언트 브라우저 사이에서 어떠한 프록시, 혹은 클라이언트 브라우가 캐쉬를 해서는 안되는 동적인 내용을 생성합니다. 이 함수로 여러 프록시와 클라이언트에서 캐쉬를 비활성화할 수 있습니다:

<?php
// 과거의 날짜
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// 항상 변경됨
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");
?>

참고: 페이지가 위의 모든 헤더를 출력하지 않아도 캐쉬가 되지 않을 수는 있습니다. 사용자 브라우저의 기본 캐쉬 방침을 바꿀 수 있는 수많은 옵션이 존재합니다. 위의 헤더들을 전송해서, 모든 설정을 덮어씌울 필요가 있습니다. 그렇지 않으면, 스크립트의 출력을 캐쉬할 수도 있습니다.

추가적으로, session_cache_limiter()와 session.cache_limiter 설정으로 세션을 사용할 때 자동적으로 적합한 캐쉬 관련 헤더를 생성할 수 있습니다.

header()는 보통의 HTML 태그, 파일의 빈 줄, PHP 생성을 포함한 모든 출력을 전송하기 전에 호출해야 합니다. header() 호출이 이루어지기 전에 include(), require(), 혹은 다른 파일 접근 함수를 이용할 때, 공백이나 빈 줄을 출력하는 것은 매우 자주 발생하는 오류입니다. 이와 같은 문제는 하나의 PHP/HTML 파일을 사용할 때도 존재합니다.


<?php
/* 에러가 납니다. header() 호출 전에
* 위의 출력이 있는 점에 주의하십시오. */
header('Location: http://www.example.com/');
?>

참고: PHP 4에서, 전송하기 전까지 브라우저에 대한 모든 출력 오버헤드를 서버 버퍼에 넣는 출력 버퍼링을 사용하여 이 함수를 호출 하기 전에 출력을 보낼 수 있습니다. 스크립트에서 ob_start()와 ob_end_flush()를 호출하거나, php.ini나 서버 설정 파일에서 output_buffering을 설정해서 이를 사용할 수 있습니다.

사용자에게 생성한 PDF 파일 등의 전송한 데이터를 저장할지 묻도록 하려면, Content-Disposition 헤더로 권장하는 파일명을 제공하여 브라우저가 저장 다이얼로그를 표시하도록 할 수 있습니다.

<?php
// PDF를 출력합니다.
header('Content-type: application/pdf');

// download.pdf로 불립니다.
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// PDF 소스는 original.pdf
readfile('original.pdf');
?>

참고: Microsoft Internet Explorer 4.01은 버그로 인해 작동하지 않습니다. 해결책은 없습니다. Microsoft Internet Explorer 5.5 역시 이를 다루는 부분에 버그가 존재하며, 서비스팩 2 이후로 업그레이드해서 해결할 수 있습니다.

참고: 안전모드에서 WWW-Authenticate 헤더(HTTP 인증에 사용)를 설정하면 스크립트의 uid가 realm 부분에 추가됩니다.

참고: headers_sent(), setcookie(), HTTP 인증 섹션.
댓글목록

등록된 댓글이 없습니다.