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
CODE


BrowserMatchNoCase 지시자


BrowserMatch 와 같지만 대소 문자를 구분하지 않고 처리한다. 대부분 브라우저가 User-Agent 헤더를 Mozilla 와 같이 대문자로 보내므로 다음 구문은 browser=netscape 가 설정되지 않는다.

BrowserMatch ^mozilla browser=netscape
CODE



BrowserMatchNoCase 를 사용하면 대소문자를 가리지 않으므로 browser=netscape 가 설정된다.

BrowserMatchNoCase ^mozilla browser=netscape
CODE


SetEnvIf 지시자


문법: SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ..

SetEnvIf 지시자는 HTTP 요청 속성에 따라 환경 변수를 정의하는 지시자이다. 첫번째 매개변수인 속성(attribute)은 다음중 하나가 될 수 있다.

  1. HTTP 표준에 지정된 요청 헤더 필드(예: Accept, HostUser-AgentReferer, Accept-Encoding등)

  2. 요청의 다음 속성중 하나
    • Remote_Host - 요청한 클라이언트의 호스트 이름(있을 경우)
    • Remote_Addr - 요청한 클라이언트의 IP
    • Server_Addr - 요청을 수신한 서버의 IP
    • Request_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 에서도 자주 쓰이니 기억해 두자.
  3. 요청과 관련 있는 환경 변수 목록. SetEnvIf 를 여러 개 사용할 경우 이전 SetEnvIf 에서 설정한 변수가 있으면 해당된다. 아래의 사용 예제 3번을 보면 이해할 것이다.


두 번째 매개변수인 regex는 정규 표현식이다. 전절에서 설명한 내용을 참고하자.

마지막은 변수의 설정, 해제 여부이다. 다음과 같이 세 가지 방법으로 사용할 수 있으며 공백을 기준으로 한 번에 여러 개 변수를 설정할 수 있다.

  1. varname : varname 이라는 변수의 값이 1 로 설정된다.
  2. !varname : varname 이라는 변수가 삭제된다. 설정을 해제할 때 사용하자.
  3. 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
CODE


 

리퍼러 체크

리퍼러 환경 변수에 내부 호스트 주소가 설정 되어 있을 경우 from_intra 라는 변수 설정한다.

SetEnvIf Referer www\.example\.com from_intra
CODE


 

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 
CODE




SetEnvIfNoCase 지시자

SetEnvIf 와 용도와 문법은 동일 하지만 정규 표현식에서 대소 문자를 구분하지 않으므로 대소 문자 구분을 하지 말아야 하는 경우에 유용하다.


Ref