Not Found Page 에러시 검색 페이지로 연결하기 
블로그에 글을 쓰다보면, 글 수정시 본문만 조금 수정하는 경우도 있지만 아예 해당 엔트리를 삭제하고 유사한 다른 글을 쓰는 경우도 있고 또 본문은 놔두고 제목만 좀더 설명적인 어구로 수정하는 경우도 있다. 또 일어날 수 있는 예상 가능한 경우로는, 블로그 자체를 재디자인하면서 기존의 글들의 주소가 다른 상위 폴더를 기준으로 전체가 바뀐다거나 혹은 아예 다른 종류의 블로그툴로 옮겨가면서 바뀌는 등이 있을 수 있을 것이다.
이럴 경우에 예전 글의 주소가 끊어지는 결과를 초래하는데, 블로그에선 한 글의 링크는 트랙백 등으로 비교적 많이 인용되기 때문에 본의 아니게 해당 링크를 타고 자신의 블로그로 들어오려는 시도도 방해하게 된다.
이에 대한 몇가지 대처 방안이 있을 수 있는데,
일반적으로는 가장 간편한 방법으로는 자신의 Not Found Errro 페이지를 만들고 새로운 블로그로의 링크나 자동 리다이렉션 삽입 등으로 해결하는 것이다. 아니면 기존 글의 주소와 새로 생성된 글의 주소 사이에 어떤 규칙이 있다면, 웹서버상의 설정파일을 이용해서 1:1 매핑등을 통해 자동적으로 새론 글로 디라이렉션되게 해 줄 수도 있다. 이경우가 가장 이상적이겠지만, 기술적인 문제는 차치하고라도, 이런 1:1 매핑을 언제까지 계속 서비스해줘야 하나하는 문제는 남는다.
무버블타입의 경우에 그 가장 두드러진 특성 중의 하나로, 개별 글에 대해 독립적인 하나의 파일로 퍼블리싱해줄 수 있다는 것인데, 이때 해당 글의 제목으로 그 글의 URL을 만들도록 되어 있다. 이게 현재 디폴트 상황인데 많은 한국 유저의 경우, 이런 저런 이유로 한글제목을 이용한 퍼머링크 생산에 아주 소극적인게 사실이다. 이에는 별다른 이유가 있는게 아니라, 그냥 초기부터 사용했던 번호붙이는 방식과의 하위 호환성(?) 정도의 문제라고 생각된다.
개별 엔트리 파일명을 설명적 제목글로 만들 경우, 많은 이점이 있는데 그 중에 새로 적용한 것이 있어서 간단히 로깅해 둔다.
바로 위처럼, 삭제/수정/재디자인 등 여러 이유로 기존에 만들어서 메타블로그 사이트나 RSS피드, 트랙백 등으로 배포한 주소가 끊어졌을 경우에 대한 한 대책과 관계가 되는데, 바로 URL을 몇몇 문자( '/' 혹은 '_' 등 )를 기준으로 나눠서 "단어(word)"화 시켜준 후에, 이 URL에 포함된 단어들을 정규식의 OR 연산자로 묶어서 블로그의 검색페이지로 리다이렉트해주는 것이다.
이런 방법은 그 바탕에 URL이 단순히 데이터베이스 용 쿼리의 집합이거나, 단순한 숫자의 나열이 아닌, 그 페이지의 내용/제목과 관계된 형식이어야 한다는 것이 깔려 있다.
먼저 블로그의 적절한 최상위 폴더에 .htaccess 파일을 만들고 여기서 404 Not Found Error 발생시 특정한 CGI를 실행하도록 연결시킨다. 그리고 그 CGI는 URL을 특정 문자 기준으로 단어화해준후, 자신의 검색CGI페이지로 보내서, 그 단어를 가진 해당 검색결과 리스트에서 혹시 원하는 유사페이지(내용이 유사한 다른 페이지 혹은 원래 찾고자했던 파일명이 바뀐 그 페이지)를 통해 접근하도록 도와준다.
아래 CGI에는 한글로 URL을 만드는 경우, 이종(異種) 인코딩 페이지에서 링크로 들어올 경우 변경해주는 루틴 포함된 것이다.
예) not_found_page_에러시_검색_페이지로_연결하기-잘못된 페이지주소/
#!/home/bin/perl -w
BEGIN { unshift(@INC, '/home/hosting_users/.../www/mt/extlib'); }
use CGI qw/:standard/;
use Encode qw(encode decode);
use Encode::Guess qw(euc-kr ksc5601-raw utf-8);
use URI::Escape;
### ##########################################################################
my $my_encoding = 'utf8'; ### UTF-8 => 'utf8', EUC-KR => 'euc-kr'
my $webrootPath = '/home/hosting_users/.../www';
my $searchCGI = '/alog/cgi/mt-search.cgi?IncludeBlogs=1&RegexSearch=1&search=';
my $archivesPath= '/alog/archives'; ### no trailing '/';
my $minimum_search_keywords = 3;
### ##########################################################################
my $path = $ENV{"REDIRECT_URL"};
my $tmp_encode = guess_encoding($path);
$q = new CGI;
if($tmp_encode->name ne $my_encoding) {
$path = encode($my_encoding, $tmp_encode->decode($path));
$f = $webrootPath . $path;
if(-e $f) {
$path = uri_escape($path);
$path =~ s/%2f/\//gi;
print $q->redirect($path);
}
else { gotoSearch($path); }
}
else { gotoSearch($path); }
sub gotoSearch {
my $path = shift;
for(split(/\//, $archivesPath)) {
$path =~ s/$_//gi;
}
$path =~ s/${archivesPath}//i;
$path =~ s/\/[\d]+//g;
my @p = split(/[_\/]/, $path);
$key = '';
for(@p) {
$key .= $_.'|' if(length $_ >= $minimum_search_keywords);
}
$key =~ s/\|$//;
$key =~ s/^\.//;
$key = uri_escape($key);
print $q->redirect(${searchCGI}.$key);
}
