[첫화면으로]홈페이지주소간단히하기

마지막으로 [b]

1. 홈페이지 URL을 줄여 보자
1.1. 내 상황
1.2. 뭐가 필요한가?
1.3. .htaccess 수정
1.4.
1.5. 위키 쪽의 수정
1.5.1. 다른 페이지 또는 액션 링크
1.5.2. 스타일쉬트, 자바스크립트 등
1.6. 관련 문서
1.7. Comments

1. 홈페이지 URL을 줄여 보자

현재:
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/페이지이름" 수준까지 줄여버리고 싶기도 한데, 나중에라도 블로그든 뭐든 더 추가로 계정에서 굴리려면 그걸 추가할 수 있는 여지는 남겨 둬야하니...

1.1. 내 상황

서버의 상태는 다음과 같다.
/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.2. 뭐가 필요한가?

만일 아파치 웹서버 설정을 바꿀 수 있는 권한이 있다면 Alias 나 ScriptAlias 라는 옵션을 사용해서도 같은 효과를 낼 수 있다고는 하는데, 항상 그럴 수 있을리가 없다.

대신 여기서는 아파치의 [mod_rewrite 모듈]을 사용한다. 이것도 서버에 따라 설치되어 있지 않은 경우가 있을지 모르겠는데, 적어도 주인장이 쓰는 서버에는 설치되어 있더라 :-)

1.3. .htaccess 수정

/home/gypark/public_html/.htaccess 파일에 다음과 같은 내용을 집어넣는다. (좌측 행번호는 편의상 넣은 것임)
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의 자세한 설명은 [문서의 해당 섹션]을 참조하자. 사실 주인장도 읽다가 머리가 아파서 말았다. -.-;

1.4.

브라우저 웹서버가 받은 요청 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 _

1.5. 위키 쪽의 수정

이제 http://gypark.pe.kr/wiki 라고만 주소창에 넣어도 http://gypark.pe.kr/cgi-bin/wiki/wiki.pl 이 뜨는 것을 볼 수 있다.

그런데 그 상태에서 위키 페이지 안의 이런 저런 링크들을 눌러보면 죄다 찾을 수 없다는 에러가 난다. 그리고 스타일쉬트도 적용되지 않아서 엉망으로 보일 것이다.

위키의 html 출력 중에 상대 경로로 되어 있는 링크다 URL 등이 죄다 저 바뀐 주소에 맞춰 적용되어서 그렇다.

예:
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 나, 첨부파일, 이미지 등의 경로도 전부 마찬가지

따라서, href=""안에 이제는 절대 경로가 들어가도록 해야 한다.2

1.5.1. 다른 페이지 또는 액션 링크

내가 원하는 건 이런 링크들도 다 "gypark.pe.kr/wiki/" 형식으로 링크가 걸리는 것이다. 이 것은 환경설정 변수 중에 $FullUrl에 적어 준다.
$FullUrl     = "http://gypark.pe.kr/wiki";  # 이렇게 도메인 명까지 적어 주던가
$FullUrl     = "http:/wiki";                # (X) 여기와 아래처럼 도메인 명을 안 쓸 경우 RSS 출력 등에서 문제가 된다.
$FullUrl     = "/wiki";                     # (X) 

페이지나 액션을 링크하는 것은 위키 소스 내에서 "$ScriptName" 변수가 사용된다. 그리고 이 변수는 FullUrl의 값이 없으면 적절한 상대경로로 값이 정해지고, 있으면 FullUrl의 값을 그대로 사용한다3.

1.5.2. 스타일쉬트, 자바스크립트 등

$ScriptName 변수를 쓰지 않고 주소를 표시하는 것들이 있다. 대표적으로 스타일 쉬트가 그렇다. 이런 건... 별 도리 없이 일일이 환경설정 변수를 고쳐 주어야 한다.

# 스타일 쉬트 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과, 위키 스크립트가 내부적으로 쓰는 디렉토리 이름들을 구분해 놓지 않아서, 사실 정확히 필요한 변수를 다 챙기기 힘들다. 이 외에도 누락된 게 있을지도 모름 =.=;

1.6. 관련 문서

1.7. Comments

역시 마찬가지로... 제 홈을 방문하시는 분들은 웬만하면 북마크나 RSS등을 새로 지정해 주시고.. (최근변경내역 링크나 RSS 링크들도 "gypark.pe.kr/wiki/***" 형태로 바뀌어 있습니다) 혹시 뭔가 안 되는게 보이시면 알려 주시면 정말 감사하겠습니다 ^_^
-- Raymundo 2007-2-6 9:31 pm

질문이.. 기존 링크로 들어오는 것은 그대로 보여지는 건가요?
-- Nyxity 2007-2-7 3:40 pm

아 그대로 보여지는군요.
-- Nyxity 2007-2-7 3:40 pm

Alias류는 URL을 file-path로 보내므로 여타 디렉토리에 의존한 path들이 다 깨질 우려가 있습니다.
-- 김동업 2007-2-12 10:12 pm

오 그런가요. 좋은 정보 감사합니다~ ^^
-- Raymundo 2007-2-12 10:23 pm
이름:  
Homepage:
내용:
 


주인장분류 위키위키분류 컴퓨터분류
각주:
1. 사실 이 때 웹서버 로그를 보면 "GET /wiki"라고 나오는데... 그럼 패턴에 "^/wiki(/.*)?"라고 앞에도 슬래쉬를 붙여줘야 할 것 같은데 막상 그렇게 해보면 안 되더라
2. "../"를 사용해서 "../cgi-bin/wiki/wiki.css"와 같은 식으로 상대 경로를 사용해도 되지 않겠냐고 생각할 수 있는데, 유즈모드에서는 하위페이지를 지원하기 때문에 "/wiki" "/wiki/페이지" "/wiki/페이지/하위페이지" 각각에 대해 필요한 "../"의 갯수가 달라진다.
3. 단 UseModWiki소스수정/SlashLinks처리 패치가 되어 있어야 함

마지막 편집일: 2012-2-11 12:25 am (변경사항 [d])
2353 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기