mod_headers - Apache HTTP Server

Apache HTTP Server Version 2.0

Apache > HTTP Server > Documentation > Version 2.0 > 모듈

# 아파치 모듈 mod_headers

가능한 언어: en | ko

설명: | HTTP 요청 헤더와 응답 헤더 수정
상태: | Extension
모듈명: | headers_module
소스파일: | mod_headers.c
지원: | `RequestHeader`는 아파치 2.0에만 있다

### 요약

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

### 지시어들

### 주제

- 처리 순서
- 예제

## 처리 순서

`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"로 설정한다.

## 예제

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`

## 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`를 사용한다. 이는 어떤 내부 헤더표에 동작할지를 결정한다. `onsuccess`는 `2xx` 상태코드를 뜻하고, `always`는 (`2xx`를 포함한) 모든 상태코드를 뜻한다. 특히 어떤 모듈이 설정한 헤더를 해제하고 싶다면, 둘중 어떤 것을 사용할지 잘 살펴봐야 한다.

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

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

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

`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` 지시어를 처리한다. 그래서 헤더 필터가 추가하는 헤더를 제외한 대부분의 헤더를 설정하거나 덮어쓸 수 있다.

## 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` 지시어를 처리한다. 그래서 브라우저에 따라 혹은 아파치 입력필터가 헤더를 덮어쓰거나 수정할 수 있다.

가능한 언어: en | ko