정규표현식 010. 웹 서버 설정에도 필요

조회 수 7801 추천 수 0 2012.01.11 09:17:21
여기서 한 가지 일화. 예전에 어느 인터넷 사이트를 분석하다가 쌩고생한 적이 있습니다. 어느 사이트의 URL 주소가 다음과 같다면,

http://a.b.c/d/e

이는 a.b.c라고 하는 도메인 밑에 d라는 디렉토리가 있고 다시 그 밑에 e라고 하는 디렉토리가 있다는 뜻이잖아요. 아니면 e라는 파일(확장자가 없는)이 있든가요. 만약 e가 디렉토리라면 그 디렉토리 내의 기본문서가 내부적으로 실행될 것이고요. 기본문서는 php의 경우 대개 index.php죠. 물론 웹서버에서 임의로 세팅할 수 있지만요.

그런데 그 사이트는 e라는 디렉토리도 없고 e 파일도 없는 것이었어요. 이것만이 아니라 다른 URL도 뻑하면 해당 디렉토리나 파일이 없는 거에요.

“이거 유령 사이튼가, 우째 파일도 없는데 실행은 되는 거지? 귀신이 곡할 노릇이네.”

하면서 그 이유를 알아내려고 여기저기 뒤지고 다니다 보니 아파치 웹서버에 mod_rewrite 라는 옵션이 있지 뭡니까. 일종의 리다이렉트인데 사용자가 입력한 URL을 다른 주소로 치환시켜주는 기능입니다. 긴 주소를 짧게 쓸 수 있게 해주는, 나름 편리한 기능이죠. 실제 주소를 위장함으로써 일종의 보안 목적으로도 쓸 수 있다지만 그보다는 짧은 주소를 사용함으로써 입력을 편하게 해주고 주소를 기억하기 쉽게 해준다는 게 더 큰 목적이겠죠.

그런데 이 옵션을 설정하려면 정규식을 알아야 하더군요. 흐흐흐... 정규식, 그거 공부하면 밥이 나오냐, 떡이 나오냐 하셨던 분들. 어떠세요. 배워두면 다 쓸 데가 있죠?

말이 나온 김에 조금만 더 알아보겠습니다. 리눅스 + 아파치를 플랫폼으로 하는 경우 리디렉트를 필요로 하는 각 디렉토리마다 .htaccess라는 파일을 두고 이 파일에 설정된 내용에 따라 리디렉트가 이뤄지는 구조입니다. 이 파일의 내용을 조금 맛보여드리면,

RewriteEngine On

# administrator page
RewriteRule ^admin/?$ ./index.php?module=admin [L]

# document permanent link
RewriteRule ^([0-9]+)$ ./index.php?document_srl=$1 [L]

# mid link
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_]+)/?$ ./index.php?mid=$1 [L]

# mid + document link
RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?mid=$1&document_srl=$2 [L]

위와 같습니다. 맨 윗 줄은 mod_rewrite 옵션을 켜두는 것이고 그 다음은 실제 리디렉트가 이뤄지게 하는 규칙들의 나열입니다. #으로 시작하는 줄은 주석(comment)이고요. ^admin/?$ ./index.php?module=admin [L]라고 하는 줄이 보이시죠? 이는 admin으로 시작해야 함을 의미합니다. /?$는 슬래시(/)가 없거나 있다면 하나가 있는 경우이고 $는 이러한 문자열로 끝나야 함을 의미합니다. 그러니까 이 경우 다음과 같은 주소가 모두 해당되겠네요.

admin
admin/

그런데 사용자가 입력한 문자열과 실제의 주소를 하나씩 죽 매핑시켜 놓으면 될텐데 왜 굳이 그 복잡한 정규식을 사용하는 걸까요? 얼핏 보면 당연한 질문 같지만 그러나 이러한 문제에 있어 정규식 외에는 답이 없답니다. 사용자가 입력하는 문자열이 고정되지 않는 경우가 허다하기 때문이죠. 가령, URL 뒤에 따라붙는 get 값이 그 경우입니다. get값이 뭐냐고요? 음냐~ 이거는 웹 프로그래밍을 조금 알아야 되는 부분이라서리...

웹사이트의 어느 특정 페이지로 들어갈 때 패러미터가 필요한 경우가 있습니다. 가령, 게시판에서 어느 특정 글을 클릭하면 그 글을 보여주는 경우죠. 이때 대개 해당 글에 관한 정보를 get 값으로 해서 다른 페이지로 넘어가게 됩니다.

이거 어쩌다가 get 값 얘기가 나온 거지? 가물가물~~ 아무래도 오늘은 대충 여기서 줄여야 할까 봅니다. 아, 이제 생각났네요. get 값은 사용자가 치기 전까지는 알 방법이 없습니다. 가령 이렇게 되는 거죠.

http://a.b.c/index.php?page=23&no=35

위에서 물음표(?) 다음의 문자열이 get 값입니다. 해당 페이지가 게시판이라고 가정한다면 위 문자열은 23페이지의 35번이라는 의미라고 대충 때려잡을 수 있습니다. 아무튼 이러한 전체 URL을 어떻게 미리 알아서 매핑시킬 수가 있겠습니까. 그러자면 거의 무한대에 이르는 경우의 수가 존재할테니 말입니다. 해서 정규식이 필요한 거죠.

위의 예에서 보여드린 ^([a-zA-Z0-9_]+)/([0-9]+)$가 바로 그런 경우입니다. 영문자나 숫자나 밑줄문자로 시작해서 죽 이어지다가 슬래시가 붙고 숫자로 끝난다는... 에고, 내일 뵙죠.

List of Articles
번호 제목 글쓴이 날짜 조회 수
29 정규표현식 029. 자바스크립트의 정규식 5 마라톤맨 2012-03-28 8853
28 정규표현식 028. 자바스크립트의 정규식 4 마라톤맨 2012-03-09 4649
27 정규표현식 027. 자바스크립트의 정규식 3 마라톤맨 2012-03-02 4808
26 정규표현식 026. 자바스크립트의 정규식 2 마라톤맨 2012-02-27 5494
25 정규표현식 025. 자바스크립트의 정규식 1 마라톤맨 2012-02-22 7055
24 정규표현식 024. 숙제와 답 마라톤맨 2012-02-17 4970
23 정규표현식 023. 정규식의 옵션과 여러 정규식 엔진들 마라톤맨 2012-02-15 18983
22 정규표현식 022. 드라이브명과 디렉토리, 파일명 분리 2 마라톤맨 2012-02-13 10215
21 정규표현식 021. 드라이브명과 디렉토리, 파일명 분리 1 마라톤맨 2012-02-08 7777
20 정규표현식 020. IP 주소 유효성 검사 2 마라톤맨 2012-02-06 6600
19 정규표현식 019. IP 주소 유효성 검사 1 마라톤맨 2012-02-02 56812
18 정규표현식 018. 하위 표현식 3 마라톤맨 2012-01-30 5013
17 정규표현식 017. 하위 표현식 2 마라톤맨 2012-01-27 4116
16 정규표현식 016. 하위 표현식 1 마라톤맨 2012-01-25 5930
15 정규표현식 015. 최대 매치와 최소 매치 2 마라톤맨 2012-01-20 4542
14 정규표현식 014. 최대 매치와 최소 매치 1 마라톤맨 2012-01-18 7947
13 정규표현식 013. 검색할 위치 2 마라톤맨 2012-01-16 4660
12 정규표현식 012. 검색할 위치 1 마라톤맨 2012-01-13 5259
11 정규표현식 011. 검색 문자 개수 지정하기 머니북 2012-01-12 9498
» 정규표현식 010. 웹 서버 설정에도 필요 머니북 2012-01-11 7801