내가 운영하는 left21 웹마스터 블로그 주소가 바뀌었다. 원래는 설치형이었는데 textcube로 옮긴 것이다.

도메인은 레프트21 것을 사용해서 webmaster.left21.com 이다.

이 때, 사람들에게야 공지를 해서 “여기로 바뀌었습니다.” 하면 되겠지만, 검색엔진에는 그런 식으로 못한다.

지금까지 쌓아올려 두었던 검색엔진에서의 순위를 다 포기해야 하는 것이 될 수도 있단 말이다!

여기 사례가 있다 : 구글 웹마스터 센터, 웹마스터 도구에서 주소변경시 문제입니다.

그리고 위 링크에서 첫 번째 참조 링크가 도움이 된다. 301 리디렉션

rewrite_module을 사용한다

이럴 때를 위해 301 redirection이 있는 거라고 하는데… 301 redirection이 뭔지 찾아봤다. 여기에 설명이 제일 잘 돼 있다.

HTTP 301

URL이 영구적으로 이동했음을 의미하는 HTTP 301은 요청된 URL과 관련된 모든 기록이나 링크가 새로운 주소로 업데이트 되어야 함을 알려주는 상태 코드 입니다. 단순한 리다이렉션이 아니라 영구적으로 이동했음을 나타내주기 때문에, URL 변경시에 검색엔진 최적화를 위한 최고의 방법 입니다.

[출처] .htaccess mod_rewrite을 이용한 301 리다이렉션|작성자 코딩하는CEO

php에서 header로 다른 주소로 이동시켜버리는 방법도 있는 것 같은데, 내가 사용한 방법은 아래와 같다.

.htaccess 파일을 설정한다. .htaccess 파일을 사용할 수 있게 아파치2 설정을 하는 건 앞에서 다뤘다.

이번엔 내용을 다룬다.

이해불능하지만

나도 아직 다 이해가 안 간다. 그러나 코드 긁어서 쓰는 건 가능하다.

나도 어디선가 긁은 거다. 아파치에서 제공하는 설명서는 앞서 구글에 제공한 설명인 301 리디렉션에 링크가 나오는데, 아래 링크다.

Apache URL 재작성 가이드 ◀ 이것이 바로 내가 오래도록 찾아 헤맨 .htaccess 실용적 작성법이 설명돼 있는 문서다.

여튼간에, 내가 구현한 코드는 아래와 갔다. 기본적으로는, 위의 재작성 가이드를 보고 이해해서 만든 코드가 아니라 다른 데서 긁은 코드다.

하지만, 긁을 때 좀더 이해를 한 채로 긁었다는 점이 중요하다. 1년 전만 해도 그냥 눈이 돌아갈 뿐이었단 말씀.

자, 내가 작성한 .htaccess 코드는 다음과 같다.

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule   ^webmaster/(.*)$    http://webmaster.left21.com/$1  [L,QSA]
RewriteRule   ^webmaster/    http://webmaster.left21.com/  [L,QSA]
RewriteRule   ^webmaster    http://webmaster.left21.com/  [L,QSA]
RewriteRule   ^    http://webmaster.left21.com/  [L,QSA]

차분히 설명하겠다.

1라인 : Rewrite 엔진을 켜겠단 말이다.

2라인 : Rewrite 기준 URL을 잡는 것 같다. 웹마스터 블로그의 경우 원래 주소가 http://blog.left21.com/webmaster 다. 이 때 기준을 /로 잡으로면 http://blog.left21.com/ 이 기준이 될 터.

3-4라인 : 모르겠다.

5라인 : ^는 정규식에서 시작을 뜻한다. 즉, ^webmaster/는 아까 앞에서 설정한 RewriteBase와 연결돼, http://blog.left21.com/webmaster/ 가 된다. (.*)는 정규식에서 길이 ‘1부터 무한대까지 아무 글자나’를 뜻하게 된다. 즉, 우리가 흔히 사용하는 이스케이프 문자로 이해한다면 ^webmaster/(.*)는 http://blog.left21.com/webmaster/* 정도가 될 것이다. 무슨 말인지 알간? (.*)뒤에 붙은 $는 (.*)에 붙인 표식이다. 정규식마다 하나씩 $를 붙여 주는 것 같다.(‘같다’라는 건 확신이 없다는 뜻이다.)

5라인은 길다. 계속 설명한다. 그 다음 나온 http://webmaster.left21.com/$1는? ^webmaster/(.*)$ 형태로 들어온 트래픽을 http://webmaster.left21.com/$1 으로 보내라는 뜻이다. 자, 여기서 $1에 주목하자. 앞서 나온 $의 개수에 따라 $1, $2, $3 같은 식으로 이걸 써 주게 된다는 것을 유념하자.

즉, 만약 http://blog.left21.com/webmaster/entry/for-issuebar 라는 주소로 들어온다면? (.*)에 해당하는 부분이 /entry/for-issuebar가 될 것이고, 얘를 보존해 뒀다가 http://webmaster.left21.com/$1의 $1 부분에 붙인다. 그래서 결과적으로 주소는 http://webmaster.left21.com/entry/for-issuebar 가 되는 것이다.

[L,QSA]은 뭔지 모르겠다.

6라인 : 5라인 이해했으면 6~8라인은 쉽다. 정규식이 없기 때문이기도 할 거다. 6라인은 http://blog.left21.com/webmaster/ 로 들어온 트래픽을 http://webmaster.left21.com/ 로 보내라는 뜻이다.

7라인 : http://blog.left21.com/webmaster 로 들어온 트래픽을 http://webmaster.left21.com/ 로 보내라는 뜻이다. 6라인과 7라인에서 차이는 / 하나밖에 없는데, 저런 것까지 신경쓰는 버릇을 들이는 게 좋다.

8라인 : http://blog.left21.com/ 으로 들어온 트래픽을 http://webmaster.left21.com/ 로 보내라는 뜻이다.

내가 이 .htaccess를 처음 봤을 때의 당혹감이 생생히 살아있어서 이렇게 열심히 적었다.

좀더 깊이 공부하고 싶은 사람들은 Apache URL 재작성 가이드를 꼭 읽어보길 권한다. 나도 아직 다 안 읽긴 했지만.

그럼 이만.