절대주소 패치

얼마 전 태터툴즈들 1.1.2로 판올림하면서 블로그의 환경 설정대로 모든 주소가 숫자가 아닌 제목으로 표시될 수 있도록 blog/entry/index.php 파일을 패치했다. 이렇게 패치한 이유는 블로그 설정에서 숫자 대신 문자를 사용하도록 설정하면 모든 주소가 제목으로 표시되어야 하는데 접근하는 주소만 제목으로 표시되고 내부 주소는 여전히 숫자로 표시되기 때문이었다. 숫자로 표시한 주소가 문자로 표시한 주소보다는 간단하며, URL 인코딩에 의해 글자가 깨지는 것처럼 보이지 않기 때문에 더 유리할 것 같지만 검색 엔진으로 검색할 때는 의미없는 숫자 보다는 문자가 더 잘 검색되기 때문이다.

절대주소 패치

얼마 전 태터툴즈들 1.1.2로 판올림하면서 블로그의 환경 설정대로 모든 주소가 숫자가 아닌 제목으로 표시될 수 있도록 blog/entry/index.php 파일을 패치했다. 이렇게 패치한 이유는 블로그 설정에서 숫자 대신 문자를 사용하도록 설정하면 모든 주소가 제목으로 표시되어야 하는데 접근하는 주소만 제목으로 표시되고 내부 주소는 여전히 숫자로 표시되기 때문이었다. 숫자로 표시한 주소가 문자로 표시한 주소보다는 간단하며, URL 인코딩에 의해 글자가 깨지는 것처럼 보이지 않기 때문에 더 유리할 것 같지만 검색 엔진으로 검색할 때는 의미없는 숫자 보다는 문자가 더 잘 검색되기 때문이다.

처음에는 문자로 표시하는 주소는 모두 blog/entry/index.php에서 처리하므로 이 파일만 패치하면 될 것으로 생각했다. 그러나 맑게개인오후님의 답글 처럼 blog/entry/index.php 파일 외에 상당히 많은 파일을 패치해야 모든 주소가 문자로 표시되었다. 그러나 문제는 blog/entry/index.php 파일은 어차피 문자 주소로 찾아올 경우 글의 내용을 표시하는 파일이라 모두 문자로 표시하도록 패치해도 상관없지만 다른 파일들은 블로그의 환경 설정에 따라 동작해야 하기 때문에 결국 오늘 다시 태터툴즈를 패치하게 되었다.

이 패치는 지난번 패치와 비슷하다. 아울러 모든 파일에 같은 패치를 적용할 수 있다. 다만 blog/search/index.php 파일은 검색 결과를 표시하는 파일로 찾은 글의 목록외에 댓글 목록을 표시하는 부부이 더 있다. 따라서 이 댓글 목록도 블로그 환경 설정에 따라 숫자, 또는 제목으로 표시할 수 있도록 추가로 패치 이 패치는 가급적 blog/index.php 파일까지 패치하는 것이 좋다. blog/index.php 파일의 패치는 지난 번 글에서 설명했지만 MSIE 6과 MSIE 7에서 문자 주소를 처리하는 방법이 달라 두 브라우저 모두에서 동작할 수 있도록 패치했다.

blog/index.php

보통 https://offree.net/처럼 블로그의 주소를 입력하면 '관리도구/스킨/출력 설정'에서 설정한 '한 쪽당 글 수'에 따라 블로그 페이지가 표시된다. 그러나 나는 '한 쪽당 글 수를 1로 설정'하고 있고 블로그에 접속하면 바로 가장 최근 글로 가도록 패치해서 사용하고 있다. 예를들어 주소에서 https://offree.net/을 치고 들어오면 자동으로 최근 글인 https://offree.net/entry/Million-Visitors로 연결된다.

이렇게 하는 이유는 간단하다. 글에 있는 모든 링크를 절대 주소로 만들기 위해서이다. 이 패치를 하지않으면 블로그 아래쪽의 페이저(|1|2|3|...|697|)의 링크는 https://offree.net/?page=1 처럼 표시되지만 이 패치를 해주면 아래쪽 페이저에도 https://offree.net/entry/Join-Me2Day처럼 절대 주소로 표시되기 때문이다.

이렇게 패치하는 방법은 간단하다. 일단 FTP를 지원하는 편집기(예: [EditPlus])로 /blog/index.php 파일을 열고 가장 마지막의 print $view를 주석으로 처리한 뒤 다음처럼 세 줄을 추가하면된다.

//print $view;
if(ereg('MSIE 6',$_SERVER['HTTP_USER_AGENT'])) 
    $slogan=iconv('UTF-8', 'EUC-KR', $entries[0]['slogan']);
else $slogan=$entries[0]['slogan'];
header("Location:".불blogURL."/entry/".불slogan);
?>

절대 주소

나는 얼마 전부터 절대 주소를 표시하는 방법을 숫자가 아닌 문자로 하고 있다. SEO에서 주장하는 것처럼 검색 엔진에 더 잘 검색되는지 확인하기 위한 것이다. 그런데 문제는 페이지의 절대 주소는 다 문자로 표시되는데 페이지 내의 최근 글, 댓글, 걸린 글은 문자가 아니라 숫자로 표시된다. 따라서 나는 이 부분 역시 패치해서 사용하고 있다.

공통 패치

블로그의 환경 설정에 따라 모든 링크를 숫자 또는 문자로 표시하려면 상당히 많은 파일을 패치해야 한다. 그러나 패치하는 방법은 모두 같으며 패치해야 하는 파일은 다음과 같다.

**패치할 파일**
blog/archive/index.php
blog/archive/item.php
blog/category/index.php
blog/entry/index.php
blog/guestbook/index.php
blog/location/index.php
blog/notice/index.php
blog/notice/item.php
blog/page/index.php
blog/page/item.php
blog/search/index.php
blog/tag/index.php
  • 최근글

    변경전
    **getRecentEntries 함수**
    $result=DBQuery::query("SELECT e.id, e.title, e.comments
        FROM {$database['prefix']}Entries e
        LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner 
        AND e.category = c.id
        WHERE e.owner = $owner AND e.draft = 0 $visibility AND e.category >= 0
        ORDER BY published DESC LIMIT {$skinSetting['entriesOnRecent']}");
    
    **getRecentEntriesView 함수**
    global $blogURL,$skinSetting;
    
    dress('rctps_rep_link',"$blogURL/{$entry['id']}",$view);
    
    변경후
    **getRecentEntries 함수**
    $result=DBQuery::query("SELECT e.id, e.title, e.comments, e.slogan
        FROM {$database['prefix']}Entries e
        LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner 
        AND e.category = c.id
        WHERE e.owner = $owner AND e.draft = 0 $visibility AND e.category >= 0
        ORDER BY published DESC LIMIT {$skinSetting['entriesOnRecent']}");
    
    **getRecentEntriesView 함수**
    global $blogURL,$skinSetting,$blog;
    
    $subURL=$blog['useSlogan']?"entry/{$entry['slogan']}":"{$entry['id']}"; 
    dress('rctps_rep_link',"$blogURL/$subURL",$view);
    
  • 댓글

    변경전
    **getRecentComments 함수**
    $sql=doesHaveOwnership()?"SELECT * FROM
            {$database['prefix']}Comments
        WHERE
            owner = $owner".($isGuestbook!=false?" AND entry=0":" AND entry>0")."
            AND isFiltered = 0
        ORDER BY
            written
        DESC LIMIT ".($count!=false?$count:$skinSetting['commentsOnRecent']):
        "SELECT r.* 
        FROM
            {$database['prefix']}Comments r
            LEFT JOIN {$database['prefix']}Entries e ON r.owner = e.owner 
            AND r.entry = e.id
            LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner
            AND e.category = c.id
        WHERE
            r.owner = $owner AND e.draft = 0 AND e.visibility >= 2 AND
            (c.visibility > 1 OR e.category = 0) ".($isGuestbook!=false?"
            AND r.entry = 0":" AND r.entry > 0")." AND isFiltered = 0
        ORDER BY
            r.written
        DESC LIMIT
            ".($count!=false?$count:$skinSetting['commentsOnRecent']);
    
    **getRecentCommentsView 함수**
    global $blogURL,$skinSetting;
    
    dress('rctrp_rep_link',"$blogURL/{$comment['entry']}#comment{$comment['id']}",$view);
    
    변경후
    **getRecentComments 함수**
    $sql=doesHaveOwnership()?"SELECT r.*, e.slogan
        FROM
            {$database['prefix']}Comments r, {$database['prefix']}Entries e
        WHERE
            r.owner = $owner".($isGuestbook!=false?" AND r.entry=0":" 
            AND r.entry>0")."AND r.isFiltered = 0 AND r.entry = e.id
        ORDER BY
            r.written
        DESC LIMIT ".($count!=false?$count:$skinSetting['commentsOnRecent']):
        "SELECT r.*, e.slogan
        FROM
            {$database['prefix']}Comments r
            LEFT JOIN {$database['prefix']}Entries e ON r.owner = e.owner 
            AND r.entry = e.id
            LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner
            AND e.category = c.id
        WHERE
            r.owner = $owner AND e.draft = 0 AND e.visibility >= 2 AND
            (c.visibility > 1 OR e.category = 0) ".($isGuestbook!=false?"
            AND r.entry = 0":" AND r.entry > 0")." AND isFiltered = 0
        ORDER BY
            r.written
        DESC LIMIT
            ".($count!=false?$count:$skinSetting['commentsOnRecent']);
    
    **getRecentCommentsView 함수**
    global $blogURL,$skinSetting,$blog;
    
    $subURL=$blog['useSlogan']?"entry/{$comment['slogan']}":"{$comment['entry']}"; 
    dress('rctrp_rep_link',"$blogURL/$subURL#comment{$comment['id']}",$view);
    
  • 걸린글

    변경전
    **getRecentTrackbacks 함수**
    $sql=doesHaveOwnership()?"SELECT *
        FROM
            {$database['prefix']}Trackbacks
        WHERE
            owner = $owner AND isFiltered = 0
        ORDER BY
            written
        DESC LIMIT ".($count!=false?$count:$skinSetting['trackbacksOnRecent']):
        "SELECT t.*
        FROM
            {$database['prefix']}Trackbacks t
            LEFT JOIN {$database['prefix']}Entries e ON t.owner = e.owner 
            AND t.entry = e.id
            LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner
            AND e.category = c.id
        WHERE
            t.owner = $owner AND e.draft = 0 AND e.visibility >= 2 AND
            (c.visibility > 1 OR e.category = 0) AND t.isFiltered = 0
        ORDER BY
            t.written
        DESC LIMIT ".($count=false?$count:$skinSetting['trackbacksOnRecent']);
    
    **getRecentTrackbacksView 함수**
    dress('rcttb_rep_link',"$blogURL/{$trackback['entry']}#trackback{$trackback['id']}",$view);
    
    변경후
    **getRecentTrackbacks 함수**
    $sql=doesHaveOwnership()?"SELECT t.*, e.slogan
        FROM
            {$database['prefix']}Trackbacks t, {$database['prefix']}Entries e
        WHERE
            t.owner = $owner AND t.isFiltered = 0 AND t.entry = e.id
        ORDER BY
            t.written
        DESC LIMIT ".($count!=false?$count:$skinSetting['trackbacksOnRecent']):
        "SELECT t.*, e.slogan
        FROM
            {$database['prefix']}Trackbacks t
            LEFT JOIN {$database['prefix']}Entries e ON t.owner = e.owner 
            AND t.entry = e.id
            LEFT JOIN {$database['prefix']}Categories c ON e.owner = c.owner
            AND e.category = c.id
        WHERE
            t.owner = $owner AND e.draft = 0 AND e.visibility >= 2 AND
            (c.visibility > 1 OR e.category = 0) AND t.isFiltered = 0
        ORDER BY
            t.written
        DESC LIMIT ".($count=false?$count:$skinSetting['trackbacksOnRecent']);
    
    **getRecentTrackbacksView 함수**
    global $blogURL,$skinSetting,$blog;
    
    $subURL=$blog['useSlogan']?"entry/{$trackback['slogan']}":"{$trackback['entry']}"; 
    dress('rcttb_rep_link',"$blogURL/$subURL#trackback{$trackback['id']}",$view);
    

blog/search/index.php

blog/search/index.php 파일은 검색한 결과를 보여주는 파일로서 글을 검색한 글 목록와 댓글 목록을 표시해준다. 문제는 글 목록은 정상적으로 문자로 표시되는데 댓글 목록은 문자가 아니라 숫자로 표시된다. 따라서 댓글 목록 역시 블로그 설정에 따라 숫자 또는 문자로 표시하고 싶다면 다음처럼 패치하면 된다.

변경전
dress('rplist_rep_regdate',fireEvent('ViewCommentListDate',
    Timestamp::format3($item['written'])),$itemView);
dress('rplist_rep_link',"$blogURL/{$item['entry']}#comment{$item['id']}",$itemView);

변경후
$subURL=$blog['useSlogan']?"entry/{$item['slogan']}":"{$item['entry']}"; 
dress('rplist_rep_regdate',fireEvent('ViewCommentListDate',
    Timestamp::format3($item['written'])),$itemView);
dress('rplist_rep_link',"$blogURL/$subURL#comment{$item['id']}",$itemView);

지난 번과 마찬가지로 프로그램에 대한 지식이 전혀 없어 소스를 패치할 수 없는 사람은 다음 링크에서 내려받아 사용하기 바란다.

한 가지 주의할 것은 이 패치는 태터툴즈 1.1.2.1에만 사용할 수 있다.

관련 글타래