mod_headers - Apache HTTP Server

Apache Server 2.0

<-

아파치 모듈 mod_headers

이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요.
설명:HTTP 요청 헤더와 응답 헤더 수정
상태:Extension
모듈명:headers_module
소스파일:mod_headers.c

요약

이 모듈은 HTTP 요청 헤더와 응답 헤더를 조절하고 수정하는 지시어들을 제공한다. 헤더를 합치거나 대체, 제거할 수 있다.

top

처리 순서

mod_headers가 제공하는 지시어는 서버설정의 거의 모든 장소에서 사용할 수 있다. 지시어는 주서버설정, 가상호스트 섹션, <Directory>, <Location>, <Files> 섹션, .htaccess 파일에서 사용할 수 있다.

지시어는 아래 순서대로 처리된다.

  1. 주서버
  2. 가상호스트
  3. <Directory> 섹션과 .htaccess
  4. <Files>
  5. <Location>

순서는 중요하다. 다음 두 지시어를 반대로 적으면 효과가 달라진다.

RequestHeader append MirrorID "mirror 12"
RequestHeader unset MirrorID

위와 같이 적으면 MirrorID 헤더가 나오지 않는다. 반대로 적으면 MirrorID 헤더를 "mirror 12"로 설정한다.

top

예제

  1. "TS"로 시작하는 모든 요청 헤더를 응답 헤더로 복사한다.

    Header echo ^TS

  2. 응답에 요청을 받은 시간과 요청을 서비스하는데 걸릴 시간을 알려주는 MyHeader 헤더를 추가한다. 클라이언트는 이 헤더를 보고 서버의 부하를 추정하거나 클라이언트와 서버간의 병목점을 찾을 수 있다.

    Header add MyHeader "%D %t"

    응답에 다음과 같은 헤더가 생긴다.

    MyHeader: D=3775428 t=991424704447256

  3. Joe에게 안녕

    Header add MyHeader "Hello Joe. It took %D microseconds \
    for Apache to serve this request."

    응답에 다음과 같은 헤더가 생긴다.

    MyHeader: Hello Joe. It took D=3775428 microseconds for Apache to serve this request.

  4. 요청에 "MyRequestHeader" 헤더가 있는 경우에만 선택적으로 응답에 MyHeader를 보낸다. 특정 클라이언트에게만 응답에 헤더를 추가할때 유용하다. 이 예제가 동작하려면 mod_setenvif 모듈이 필요하다.

    SetEnvIf MyRequestHeader value HAVE_MyRequestHeader
    Header add MyHeader "%D %t mytext" env=HAVE_MyRequestHeader

    HTTP 요청에 MyRequestHeader: value 헤더가 있다면, 응답에 다음과 같은 헤더가 생긴다.

    MyHeader: D=3775428 t=991424704447256 mytext

top

Header 지시어

설명:HTTP 응답 헤더를 구성한다
문법:Header [condition] set|append|add|unset|echo header [value] [env=[!]variable]
사용장소:주서버설정, 가상호스트, directory, .htaccess
Override 옵션:FileInfo
상태:Extension
모듈:mod_headers
지원:Condition은 아파치 2.0.51 부터

이 지시어는 HTTP 응답 헤더를 합치거나 대체, 제거한다. 내용 핸들러와 출력 필터가 실행한 직후에 헤더를 수정하기때문에 보낼 헤더를 수정할 수 있다.

condition은 선택적으로 사용하며, 값으로 onsuccess 혹은 always를 사용한다. 이는 어떤 내부 헤더표에 동작할지를 결정한다. onsuccess2xx 상태코드를 뜻하고, always는 (2xx를 포함한) 모든 상태코드를 뜻한다. 특히 어떤 모듈이 설정한 헤더를 해제하고 싶다면, 둘중 어떤 것을 사용할지 잘 살펴봐야 한다.

두번째 아규먼트에 따라 기능이 다르다. 두번째 아규먼트로 아래 값중 하나를 사용할 수 있다.

set
응답 헤더를 설정한다. 같은 이름으로 이미 헤더가 있다면 대체한다. value에 형식문자열을 사용할 수 있다.
append
이미 존재하는 같은 이름의 응답 헤더에 추가한다. 기존 헤더에 새로운 값을 합치면, 기존 헤더와 새로운 값 사이에 쉼표를 붙인다. 이는 여러 헤더값을 지정하는 HTTP 표준 방식이다.
add
헤더가 이미 있더라도 응답 헤더를 추가한다. 그래서 같은 이름의 헤더가 두개 (혹은 많이) 생길 수 있다. 이 경우 의외의 결과가 발생할 수 있기때문에 보통 대신 append를 사용해야 한다.
unset
이런 이름의 응답 헤더가 있다면 삭제한다. 같은 이름을 가진 헤더가 여러개 있다면 모두 제거한다.
echo
이런 이름의 요청 헤더를 그대로 응답 헤더로 보낸다. header에 정규표현식을 사용할 수 있다.

아규먼트 뒤에 header 이름이 나온다. 헤더명 뒤에 콜론을 적을 수 있지만, 없어도 된다. set, append, add, unset에서 대소문자는 무시한다. echoheader 이름은 대수문자를 구별하고 정규표현식을 사용할 수 있다.

add, append, set을 사용할때는 세번째 아규먼트 value가 필요하다. value 안에 공백이 있다면 쌍따옴표로 묶어야 한다. value는 일반 문자열이나 형식을 기술하는 문자열이며, 두가지를 같이 사용할 수도 있다. value에서 지원하는 형식기술자는 다음과 같다.

%t 요청을 받은 시간을 국제표준시로 epoch (1970년 1월 1일) 이후 지난 마이크로초 단위로. 값 앞에 t=이 붙는다.
%D 요청을 받은 시간부터 헤더를 네트웍에 쓸때까지 걸린 시간. 요청의 기간을 잰다. 값 앞에 D=이 붙는다.
%{FOOBAR}e 환경변수 FOOBAR의 내용.

Header 지시어의 add, append, set 아규먼트를 사용하는 경우 네번째 아규먼트로 작업에 필요한 조건을 지정할 수 있다. env=... 아규먼트를 사용하면 해당 환경변수가 존재하는 경우에만 (아니면 env=!...에 나온 환경변수가 존재하지 않다면) Header 지시어가 동작한다. 그렇지 않으면 지시어는 요청에 아무 영향을 미치지 않는다.

응답을 네트웍으로 보내기 직전에 Header 지시어를 처리한다. 그래서 헤더 필터가 추가하는 헤더를 제외한 대부분의 헤더를 설정하거나 덮어쓸 수 있다.

top

RequestHeader 지시어

설명:HTTP 요청 헤더를 구성한다
문법:RequestHeader set|append|add|unset header [value]
사용장소:주서버설정, 가상호스트, directory, .htaccess
Override 옵션:FileInfo
상태:Extension
모듈:mod_headers

이 지시어는 HTTP 요청 헤더를 합치거나 대체, 제거한다. 내용 핸들러가 실행하기 직전에 헤더를 수정하기때문에 받은 헤더를 수정할 수 있다. 첫번째 아규먼트에 따라 기능이 다르다. 첫번째 아규먼트로 아래 값중 하나를 사용할 수 있다.

set
요청 헤더를 설정한다. 같은 이름으로 이미 헤더가 있다면 대체한다
append
이미 존재하는 같은 이름의 요청 헤더에 추가한다. 기존 헤더에 새로운 값을 합치면, 기존 헤더와 새로운 값 사이에 쉼표를 붙인다. 이는 여러 헤더값을 지정하는 HTTP 표준 방식이다.
add
헤더가 이미 있더라도 요청 헤더를 추가한다. 그래서 같은 이름의 헤더가 두개 (혹은 많이) 생길 수 있다. 이 경우 의외의 결과가 발생할 수 있기때문에 보통 대신 append를 사용해야 한다.
unset
이런 이름의 요청 헤더가 있다면 삭제한다. 같은 이름을 가진 헤더가 여러개 있다면 모두 제거한다.

아규먼트 뒤에 헤더명이 나온다. 헤더명 뒤에 콜론을 적을 수 있지만, 없어도 된다. 대소문자는 무시한다. add, append, set을 사용할때는 세번째 아규먼트 value가 필요하다. value 안에 공백이 있다면 쌍따옴표로 묶어야 한다. unset을 사용할때는 value를 적으면 안된다.

fixup 단계에서 요청에 해당하는 핸들러를 실행하기 직전에 RequestHeader 지시어를 처리한다. 그래서 브라우저에 따라 혹은 아파치 입력필터가 헤더를 덮어쓰거나 수정할 수 있다.