BBUWOO'S [ LIKE UNIX ] WORLD Home > Lecture > Apache > Apache-3  

HOME
WHAT's BBUWOO?
LInux AnNyung
Open Source
    GitHUB
    GitHUB (for PHP)
LECTURE
MINI LECTURE
QnA BOARD
ENGLISH POEM


WARNNING

강좌의 모든 권리는 본인 김정균에게 있으며 이 강좌를 상업적 목적 으로 이용
하거나 다른 곳으로 옮길시에는 본인의 허락이 있어야 한다. 이글의 가장 최신글은
http://oops.org 에서 확인할수 있다.



3. Apache 설정 파일에서의 환경변수의 활용

이 페이지 에서는 Apache에서 기본적으로 사용되는 환경 변수가 아닌 임의로 환경 변수를 만드는 법과 이를 설정파일과 CGI에서 활용하는 방법을 각 지시자와 예를 들어 논해보고자 한다.

[참고 문헌 : Apache: The Definitive Guide - O'Reilly]

1. SetEnv & SetEnvNoCase & PassEnv

[ SetEnv ]

  Syntax : SetEnv 변수 변수값

apache 설정 파일에서 어떠한 설정을 환경 변수로 받아 놓고 싶을때 사용을 한다.

[ SetEnvNoCase ]

SetEnv 와 동일하며 차이는 대소문자를 가리지 않는다

[ PassEnv ]

  Syntax : PassEnv  변수명

SetEnv 나 SetEnvNoCase 로 지정한 변수를 CGI에서 활용을 할수 있게 하기 위하여 사용

위의 사용예는 apache와 CGI를 Oracle과 연동을 할때를 들 수가 있다. Oracle의 경우 WEB Interface를 통하여 연동을 할 경우 Oracle의 환경변수를 웹서버가 받아 들여야 하는 경우가 많으며 이 환경 변수를 CGI로 넘겨줘야 하기 때문에 이때 전달을 하기 위한 방법으로 SetEnv와 PassEnv 를 이용 할수가 있다.

Hanterm - cat /etc/httpd/conf/httpd.conf

 [root@bbuwoo /etc]$ cat /etc/httpd/conf/httpd.conf

  생략...
  ##################################################################### 
  # Oracle 환경
  #####################################################################      
  # Environment Variable
  SetEnv LD_LIBRARY_PATH /home/oracle/lib
  PassEnv LD_LIBARY_PATH
  SetEnv ORACLE_SID ORCL
  SetEnv NLS_LANG AMERICAN_AMERICA.KO16KSC5601
  SetEnv LD_LIBRARY_PATH /lib:/usr/lib:/usr/local/lib:/home/oracle/lib
  SetEnv ORACLE_HOME /home/oracle

  생략...

 [root@bbuwoo /etc]$


2. SetEnvIf & SetEnvIfNoCase

  Syntax :
    SetEnvIf         속성  REGEX   변수명1=변수값 변수명2=변수값 ...
    SetEnvIfNoCase   속성  REGEX   변수명1=변수값 변수명2=변수값 ...

참고> REGEX - regular expression 의 약자로서 정규표현식을 의미.

일단 SetEnvIf 와 SetEnvIfNoCase 의 차이는 NoCase가 대소문자 구분을 하지 않는 것임만 알면 된다. 그외의 차이는 전혀 없다. SetEnvIf는 브라우져를 감지하여 해당 사항을 환경 변수로 받아 CGI나 apache 자체 설정에 활용을 할수 있게한다.

속성에는 Host, User-Agent, Referer 등의 HTTP-REQUEST 헤더 필드를 사용한다. HTTP-REQUEST 헤더 필드에서 얻을수 있는 환경 변수에는 다음이 존재한다.


GATEWAY_INTERFACE : 서버가 사용하고 있는 CGI specification의 revision. 예: 'CGI/1.1'.
SERVER_NAME : 현재 스크립트가 실행되고 있는 호스트의 이름. 만약 스크립트가 가상 호스트에서 실행되고 있다면, 이 값은 가상 호스트로 정의된 값이 될 것이다.
SERVER_SOFTWARE : 요구에대한 대답의 헤더에 사용할 서버 identification 문자열
SERVER_PROTOCOL : 페이지가 요구되어질 때 사용한 프로토콜의 이름과 리비젼. 예: 'HTTP/1.0'.
REQUEST_METHOD : 해당 페이지를 요구할 때 사용한 방법(method). 예: 'GET', 'HEAD', 'POST', 'PUT'.
QUERY_STRING : 해당 페이지를 접근할 때 사용된 query string.
DOCUMENT_ROOT : 현재 스크립트가 샐행중인 document root 디렉토리. 서버의 설정 파일에 정의되어 있다.
HTTP_ACCEPT : 현 요청으로 부터의 header에 대하 수용여부
HTTP_ACCEPT_CHARSET : 현 요청으로부터 헤더의 charset에 대한 수용여부 예: 'iso-8859-1,*,utf-8'
HTTP_ENCODING : 현 요청의 encodign format. 예 : 'gzip'
HTTP_ACCEPT_LANGUAGE : 현 요청의 헤더의 언어 코드. 예 : 'ko'
HTTP_CONNECTION : 현 서버의 접속 유지 상태. 예 : 'Keep-Alive'
HTTP_HOST : 현 요청에서 헤더에 들어 있는 서버 이름. 즉 유저가 주소창에 넣은 도메인 이름을 의미. 어떠한 이름으로 접속했는지를 판별
HTTP_REFERER : 어떠한 링크를 통해 접속했을 경우 해당 링크가 있었던 url.
HTTP_USER_AGENT : 현 요청의 헤더의 브라우져 정보
REMOTE_ADDR : 원격 접속자의 ip address
REMOTE_PORT : 원격 접속자의 host 이름
SCRIPT_FILENAME : 현재 실행하고 있는 script의 절대경로
SERVER_ADMIN : 아파치 설정파일에서 지정된 ServerAdmin의 값. virtual host 에서 지정이 되어 있을 경우 virtual host에서 이 환경변수를 받으면 virtual host에 지정된 값이 얻어짐
SERVER_PORT : 아파치 설정 파일에 지정된 Port 지시자의 값
SERVER_SIGNATURE : 서버 버젼과 가상 호스트 이름을 포함한 문자열
PATH_TRANSLATED : 웹 경로가 아닌 파일시스템 기반의 현재 스크립트의 절대 경로
SCRIPT_NAME : 현재 스크립의 경로를 포함한 파일이름
REQUEST_URI : 이 페이지를 접근하기 위해 주어진 URI. 예 : '/index.html'

그럼 SetEnvIf 를 이용한 예를 들어 보겠다. 여기서 소개하는 예는 내자신의 홈페이지에 있는 image를 다른 홈페이지에서 링 크를 하지 못하도록 하는 설정을 보도록 하자. 응용만 잘 한다 면 아예 html 조차도 링크를 못하게 할수가 있다.

아래의 설정은 조용준님의 설정을 약간 수정한 것이다.

Hanterm - cat /etc/httpd/conf/httpd.conf

 [root@bbuwoo /etc]$ cat /etc/httpd/conf/httpd.conf

  생략 ...
  SetEnvIfNoCase  Referer  "http://(www\.)?oops\.org"  permit
  SetEnvIfNoCase  Referer  "^$"  permit

  <Files ~ "\.(gif|jpe?g|png)$">
    Order deny,allow
    deny from all
    allow from env=permit
    ErrorDocument 403 "Can't Not image link
  </Files>
  생략 ...

 [root@bbuwoo /etc]$

간단하게 설명을 해 보도록 하자.

SetEnvIfNoCase Referer "http://(www\.)?oops\.org" permit

일단 SetEnvIf를 사용하지 않고 SetEnvIfNoCase 를 사용한 이유를 생각해 보자. 현재의 도메인 네임 체계에서는 대소문자를 가리지 않는다. 그러므로 HTTP_REFERER 의 값이 http://oops.org 이든 http://WWW.OOPS.ORG 가 동일하게 적용이 된다. 즉 http://oops.org 에서만 image가 하이퍼 링크를 하는 것을 가능하게 하려 하는데 어느 누군가 http://WWW.OOPS.ORG 와 같이 대문자로 접근을 했을 경우 이를 처리를 하지 못하는 경우가 발생할수 있으므로 대소문자 구분을 하지 않는 SetEnvIfNoCase 를 사용하는 것이다.

SetEnvIfNoCase Referer "^$" permit

이 설정은 이미지를 브라우저로 이미지를 다이렉트로 불러볼 때를 위하여 설정을 한다. 정규표현식의 의미는 처음부터 끝까지 아무것 도 없음을 의미한다. 즉 referer 가 없음을 의미한다.

정규표현식 http://(www\.)?oops\.org 의 의미는 간단하다. ()로 묶인 것은 그룹으로 처리가 되며, www. (정규 표현식의 그룹 표현 안에서는 dot charactor(.) 는 \. 와 같이 escape 문자를 써 줘야 한다. escape 문자(\)를 붙여 주지 않으면 정규표현식에서 dot charactor는 "아무거나 한 문자"를 의미한다.

?는 하나 또는 0개를 의미한다. 즉 (www\.)? 는 www. 이 한개만 있거나 없거나를 의미한다.

즉 위의 설정은 http://oops.org 나 http://oops.org 를 permit 이라는 환경변수 이름으로 받겠다는 것을 의미한다.

다음의 Files 는 아직 다루지 않은 지시자 이다. 이 부분은 아래 Files & FilesMatch Section을 참고하라.


3. BrowserMatch & BrowserMatchNoCase

  Syntax :
    BrowserMatch        REGEX   변수1=변수값  변수2=변수값 ...
    BrowserMatchNoCase  REGEX   변수1=변수값  변수2=변수값 ...

BrowserMatch는 SetEnvIf User-Agent 와 동일한 설정이다. 다만 BrowserMatch가 존재하는 이유는 구 버젼과의 호환성을 위하여 존재하고 있다. 추후로는 SetEnvIf User-Agent 가 사용되어 진다.

BrowserMatchNoCase는 위의 다른 지시자들의 경우와 마찬가지로 대소문자 구분을 하지 않는다.

대략 사용법을 설명하자면

BrowserMatch  ^Mozilla/[34]    agent=netscape   current
BrowserMatch  ^Mozilla/2       agent=netscape   old

와 같이 설정을 해 놓았다고 하자. 위의 경우 누군가 netscape 3.x 나 netscpae 4.x 대로 접근을 했을 경우 CGI에서 agent 라는 변수 값을 netscape로 받고 java 라는 변수를 생성해 놓게 된다. 그리고 netscape 2.x 로 접근을 했을 경우에는 agent 라는 변수값을 netscape로 그리고 old라는 변수를 생성해 놓게 된다.

그럼 apache 설정파일에서 BrowserMatch를 활용하는 예를 들어보자. 이 방법은 WebZip이나 Teleport 같은 프로그램으로 홈페이지를 긁어 가는 것을 막는 방법을 살펴보도록 한다.

Hanterm - cat /etc/httpd/conf/httpd.conf

 [root@bbuwoo /etc]$ cat /etc/httpd/conf/httpd.conf

  생략 ...
  BrowserMatchNoCase "WebZIP" no_access
  BrowserMatchNoCase "Teleport" no_access

  <Directory /home/path>
    Options Indexes FollowSymLinks Includes
    AllowOverride None
    Order allow,deny
    Allow from all
    Deny from env=no_access
  </Directory>

  생략 ...

 [root@bbuwoo /etc]$


위의 예제를 글로 풀어서 설명을 하자면 HTTP Request header의 User Agent의 문자열에 WebZIP(대소문자 구분 없음) 이나 Teleport 라는 문자열이 있으면 /home/path에 접근을 거부하라는 메세지 이다.

일단 Directory 지시자에 대해서는 이미 알고 있으리라 생각한다. 모르는 사람은 가슴에 손을 얹고 반성하며 httpd.conf 강좌를 다시 보기 바란다. Options 와 AllowOverride, Order, Allow, Deny 는 httpd.conf 에서 설명을 하고 있으니 여기서는 그냥 넘어간다.

그럼 여기서 중요한 것은 바로 Deny 부분이다. Deny에서 보면 보통은 Deny from aaa.com 211.111.111 과 같이 host name이나 ip address로 설정을 했었는데 여기서는 env=no_access 라는 표현 으로 설정을 해 놓았다. 바로 이것이 key point 이다.

즉 BrowserMatchNoCase 로 생성해 놓은 환경 변수 이름을 env=환경변수이름 으로 적용을 시키게 되는 것이다. 이 표현식을 알아 놓으면 아주 다양하게 적용을 시킬수 있을 것이다.


3. Files & FilesMatch

  Syntax : <Files filename>  ..  </Files>

Files 는 특정 파일에 대해 다른 지시자의 내용을 적용하고자 할때 사용을 한다. 여기서 filename은 DocumentRoot의 상대경로로 기입 을 한다. Files 와 FilesMatch 의 차이는 정규표현식을 사용하는 방 법만 다를 뿐 나머지는 동일하다. Files 에서 정규 표현식을 사용하 기 위해서는 의 형식을 이용해야 하나 FilesMatch Files 처럼 tilde (~) 문자를 적어줄 필요 없이 그냥 사용이 가능 하다. 그렇다면 위의 SetEnvIf 에 설명에서 사용된 예제를 가지고 살펴 보도록 한다.

Hanterm - cat /etc/httpd/conf/httpd.conf

 [root@bbuwoo /etc]$ cat /etc/httpd/conf/httpd.conf

  생략 ...

  SetEnvIfNoCase  Referer  "http://(www\.)?oops.org"  perimit

  <Files ~ "\.(gif|jpe?g|png)$">
    Order deny,allow
    deny from all
    allow from env=permit
    ErrorDocument 403 "Can't Not image link"
  </Files>

  생략 ...

 [root@bbuwoo /etc]$ 


일단 제일 윗줄의 설명은 SetEnvIf 지시자 부분을 참고하도록 하고 그냥 넘어 가도록 한다. 제일 위줄의 의미는 http://oops.org 나 http://oops.org 라는 문자열이 Referer에 들어 있는 경우고 이 경우를 permit 이라는 환경변수로 적용을 시켜 놓았다는 것이다.

그 다음 <Files ~ "\.(gif|jpe?g|png)$> 는 일단 ~가 들어가 있으 므로 정규 표현식을 사용하겠다는 의미이며 "\.(gif|jpe?g|png)$" 의 의미는 *.gif 나 *.jpg, *.jpeg *.png 를 의미한다.

위의 예제를 다른식으로 동일하게 표현을 하면 다음과 같이 할수 있다.

<FilesMatch "\.(gif|jpe?g|png)$> 로 할수 있으며, <Files *.gif> <Files *.jpeg> <Files *.jpg> <Files *.png> 와 같 이 4개의 블럭으로 나누어 놓은것과 같은 역할을 한다.



>> 이전 : Apache 1.3.12 Configurations
>> 다음 : Apache Modules .. [ mod_rewrite ]



    



 Home > Lecture > Apache > Apache-3

Copyright 1997-2024 JoungKyun Kim 
LAST MODIFIED: 2017/01/18