mod_setenvif 로 조건부 환경변수 설정하기
mod_setenvif 는 특정 조건을 만족할 경우 환경 변수를 설정할 수 있는 모듈이다.
아파치 웹서버의 설정 파일에는 조건문을 사용할 수 없으나 mod_setenvif 로 조건에 따라 환경 변수를 설정하고 변수에 따라 설정을 다르게 하면 조건문과 동일한 효과를 얻을 수 있다.
BrowserMatch 지시자
문법: BrowserMatch regex [!]env-variable[=value] [[!]env-variable[=value]]
BrowserMatch 지시자는 첫 번째 매개변수인 정규표현식과 브라우저가 보낸 Usage-Agent 헤더가 일치할 경우 환경 변수를 설정하거나 해제할 수 있다.
첫 번째 줄은 브라우저 정보가 Mozilla 로 시작될 경우(^ 를 주목하자) iframe=yes browser=netscape 라는 두 개의 환경 변수를 설정하는 예제이다.
두 번째 줄은 브라우저 정보가 curl 이나 links, wget 같은 커맨드 기반의 HTTP 클라이언트일 경우 iframe=no 로 설정하고 javascript 라는 변수의 설정을 삭제하는 예제이다.
BrowserMatch ^Mozilla iframes=yes browser=netscape
BrowserMatch "^(curl|ELink|Wget)" iframes=no !javascript
BrowserMatchNoCase 지시자
BrowserMatch 와 같지만 대소 문자를 구분하지 않고 처리한다. 대부분 브라우저가 User-Agent 헤더를 Mozilla 와 같이 대문자로 보내므로 다음 구문은 browser=netscape 가 설정되지 않는다.
BrowserMatch ^mozilla browser=netscape
BrowserMatchNoCase 를 사용하면 대소문자를 가리지 않으므로 browser=netscape 가 설정된다.
BrowserMatchNoCase ^mozilla browser=netscape
SetEnvIf 지시자
문법: SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ..
SetEnvIf 지시자는 HTTP 요청 속성에 따라 환경 변수를 정의하는 지시자이다. 첫번째 매개변수인 속성(attribute)은 다음중 하나가 될 수 있다.
HTTP 표준에 지정된 요청 헤더 필드(예: Accept,
Host
,User-Agent
,Referer
, Accept-Encoding등)- 요청의 다음 속성중 하나
Remote_Host
- 요청한 클라이언트의 호스트 이름(있을 경우)Remote_Addr
- 요청한 클라이언트의 IPServer_Addr
- 요청을 수신한 서버의 IPRequest_Method
- 요청 방법(GET, POST, PUT 등)Request_Protocol
- 요청 프로토콜 및 버전(예., "HTTP/0.9", "HTTP/1.1", 등)Request_URI
- HTTP 요청에 있는 URI 이다. 브라우저에서 http://example.com/app/index.html 을 호출했을 경우 Request_URI 는 /app/index.html 가 된다 이 변수는 mod_rewrite 에서도 자주 쓰이니 기억해 두자.
- 요청과 관련 있는 환경 변수 목록. SetEnvIf 를 여러 개 사용할 경우 이전 SetEnvIf 에서 설정한 변수가 있으면 해당된다. 아래의 사용 예제 3번을 보면 이해할 것이다.
두 번째 매개변수인 regex는 정규 표현식이다. 전절에서 설명한 내용을 참고하자.
마지막은 변수의 설정, 해제 여부이다. 다음과 같이 세 가지 방법으로 사용할 수 있으며 공백을 기준으로 한 번에 여러 개 변수를 설정할 수 있다.
- varname : varname 이라는 변수의 값이 1 로 설정된다.
- !varname : varname 이라는 변수가 삭제된다. 설정을 해제할 때 사용하자.
- varname=value: varname 이라는 변수의 값에 value 를 설정한다.
이제 mod_setenvif 를 사용하여 환경 변수를 설정하고 이를 이용하여 조건에 따른 처리를 하는 예제를 살펴 보자.
이미지는 로깅 안 함
요청이 이미지일 경우 file_type 변수에 image-File 이라는 값을 설정하고 dontlog 변수를 설정하고 dontlog 변수가 설정되었을 경우 로그를 남기지 않는다.
SetEnvIf Request_URI \.(gif|jpe?g|png)$ file_type=image-File dontlog=1
CustomLog logs/access_log combined env=!dontlog
리퍼러 체크
리퍼러 환경 변수에 내부 호스트 주소가 설정 되어 있을 경우 from_intra 라는 변수 설정한다.
SetEnvIf Referer www\.example\.com from_intra
AND와 OR 연산
SetEnvIf 에는 논리적인 AND 와 OR 가 없다. 필요할 경우 복잡하지만 아래처럼 여러 개의 SetEnvIf 를 묶어서 사용할 수 밖에 없다. 아래는 요청 파일이 jpg 일 경우 object_is_image 라는 환경 변수와 JPG_PROCESSING 를 설정하는 예제이다.
SetEnvIf Request_URI "\.jpe?g$" object_is_image=jpg
SetEnvIf object_is_image jpg JPG_PROCESSING=1
SetEnvIfNoCase 지시자
SetEnvIf 와 용도와 문법은 동일 하지만 정규 표현식에서 대소 문자를 구분하지 않으므로 대소 문자 구분을 하지 말아야 하는 경우에 유용하다.