http://gypark.pe.kr/cgi-bin/wiki/wiki.pl/페이지이름 http://gypark.pe.kr/cgi-bin/wiki/wiki.pl/action=액션이름&옵션주저리주저리이것을
http://gypark.pe.kr/wiki/페이지이름 http://gypark.pe.kr/wiki/action=액션이름&옵션주저리주저리정도까지 줄이고 싶다. 음, 이렇게 대놓고 나란히 쓰니 그리 많이 줄어든 것 같지도 않다 -_-; 맘 같아서는 "gypark.pe.kr/페이지이름" 수준까지 줄여버리고 싶기도 한데, 나중에라도 블로그든 뭐든 더 추가로 계정에서 굴리려면 그걸 추가할 수 있는 여지는 남겨 둬야하니...
/home/gypark/ - 내 홈 디렉토리 /home/gypark/public_html/ - 내 DocumentRoot. http://gypark.pe.kr/ 로 접속했을 때 이 디렉토리가 최상위 디렉토리가 된다. /home/gypark/public_html/cgi-bin/wiki/ - wiki.pl, wiki.css, 기타 등등 위키 파일들이 있는 곳 /home/gypark/public_html/cgi-bin/wiki/wiki.pl - 이게 위키 스크립트 파일
1 <IfModule mod_rewrite.c> 2 RewriteEngine On 3 RewriteRule ^wiki(/.*)?$ /cgi-bin/wiki/wiki.pl$1 [L] 4 </IfModule>1번째 줄과 4번째 줄은, mod_rewrite 모듈이 있을 때만 사이에 있는 내용을 수행하라는 얘기. 2번째 줄은 저 모듈이 동작하도록 스위치를 켜는 거고, 3번째 줄이 핵심인데, 다음과 같은 식으로 구성되며:
RewriteRule 패턴 치환문자열 [옵션(없어도 됨)]패턴은 정규표현식을 쓸 수 있다. 위의 경우 "^"는 라인의 시작, 괄호 (,)는 그룹, "."는 임의의 문자 하나, "*"는 "0개 이상" (따라서 ".*"는 null string을 포함한 임의의 문자열), "?"는 "없거나 1개 있거나" (이 물음표는 왼쪽 괄호쌍에 걸린다), "$"는 라인의 끝을 의미한다. 치환문자열에는 그냥 단순한 문자열이 들어가는데, 몇 가지 변수를 쓸 수 있다. 위의 "$1"은 "좌측 패턴에서 1번째 그룹"을 가리킨다. 브라우저의 요청을 검사하여서 저 패턴에 일치하는 부분이 있으면 그 부분을 치환문자열로 교체한 후에 넘겨 준다. 이 때 제일 끝의 옵션 [L]은 저 룰에 의해 치환이 일어났으면 그 아래에 있는 룰들을 무시하고 빠져나가라는 얘기인데, 지금은 그 아래에 다른 룰이 더 없으니 있으나 마나겠다. RewriteRule의 자세한 설명은 [문서의 해당 섹션]을 참조하자. 사실 주인장도 읽다가 머리가 아파서 말았다. -.-;
브라우저 | 웹서버가 받은 요청 | rewrite 결과 | 최종 주소 | 비고 |
gypark.pe.kr/wiki | wiki1 | /cgi-bin/wiki/wiki.pl | gypark.pe.kr/cgi-bin/wiki/wiki.pl | 이 경우는 ( ) 안에 아무런 문자열이 없기 때문에 $1도 널 스트링 |
gypark.pe.kr/wiki/ | wiki/ | /cgi-bin/wiki/wiki.pl/ | gypark.pe.kr/cgi-bin/wiki/wiki.pl/ | $1 = "/" |
gypark.pe.kr/wiki/Diary | wiki/Diary | /cgi-bin/wiki/wiki.pl/Diary | gypark.pe.kr/cgi-bin/wiki/wiki.pl/Diary | _ |
gypark.pe.kr/wiki/action=version | wiki/action=version | /cgi-bin/wiki/wiki.pl/action=version | gypark.pe.kr/cgi-bin/wiki/wiki.pl/action=version | _ |
html 소스 내의 표현 | 브라우저의 해석 | 올바른 URL | 비고 |
href="wiki.pl/연습장" | gypark.pe.kr/wiki/wiki.pl/연습장 | gypark.pe.kr/cgi-bin/wiki/wiki.pl/연습장 또는 gypark.pe.kr/wiki/연습장 | 위키 내에 다른 페이지나 액션을 띄우는 링크는 죄다 이렇게 된다. |
href="wiki.css" | gypark.pe.kr/wiki/wiki.css 또는 gypark.pe.kr/wiki.css (주소가 gypark.pe.kr/wiki 인 경우) | gypark.pe.kr/cgi-bin/wiki/wiki.css | wikiscript.js 나, 첨부파일, 이미지 등의 경로도 전부 마찬가지 |
$FullUrl = "http://gypark.pe.kr/wiki"; # 이렇게 도메인 명까지 적어 주던가 $FullUrl = "http:/wiki"; # (X) 여기와 아래처럼 도메인 명을 안 쓸 경우 RSS 출력 등에서 문제가 된다. $FullUrl = "/wiki"; # (X)페이지나 액션을 링크하는 것은 위키 소스 내에서 "$ScriptName" 변수가 사용된다. 그리고 이 변수는 FullUrl의 값이 없으면 적절한 상대경로로 값이 정해지고, 있으면 FullUrl의 값을 그대로 사용한다3.
# 스타일 쉬트 URL $StyleSheet = "http://gypark.pe.kr/cgi-bin/wiki/wiki.css"; # (O) $StyleSheet = "http:/cgi-bin/wiki/wiki.css"; # (O) $StyleSheet = "/cgi-bin/wiki/wiki.css"; # (O) 스타일쉬트의 경우는 http: 를 안 적어줘도 상관없다. 다른 변수들도 거의 그런데, # 항상 그런다는 보장도 없으니 웬만하면 첫번째나 두번째가 나아 보임 # 로고 이미지 URL $LogoUrl = "/raymundo_logo.jpg"; # 아이콘 URL $IconDir = "/cgi-bin/wiki/icons/"; # 업로드 URL $UploadUrl = "http:/pub/gyparkwiki/upload"; # 이 변수는 http: 가 꼭 있어야 함 # 주의: $UploadDir 은 내부에서 쓰는 것이고, 잘 동작하고 있었다면 고치면 안 된다 # 인터위키 아이콘 URL $InterIconDir = "/cgi-bin/wiki/icons-inter/"; # 자바스크립트 파일 URL $JavaScript = "/cgi-bin/wiki/wikiscript.js"; # 오에카키 .jar 파일 URL $OekakiJar = "/cgi-bin/wiki/oekakibbs.jar"; # 이모티콘 아이콘 URL $EmoticonPath = "/cgi-bin/wiki/emoticon/";으음... 기존에 소스를 수정할 당시에 이런 날이 올 걸 예상하지 못하는 바람에, 브라우저에 노출되는 URL과, 위키 스크립트가 내부적으로 쓰는 디렉토리 이름들을 구분해 놓지 않아서, 사실 정확히 필요한 변수를 다 챙기기 힘들다. 이 외에도 누락된 게 있을지도 모름 =.=;