안녕하세요. 이곳 하우투 블로그에 글을 처음 쓰게 된 daybreaker입니다. :)

이번에 소개드릴 팁은 텍스트큐브를 웹디렉토리에 바로 설치하지 않고 하위 디렉토리에 설치하신 경우(예: example.com이 블로그 주소가 아니고 example.com/blog가 블로그 주소일 때) 다른 블로그에 댓글을 달 때 그 하위 경로까지 다 적어주지 않으면 댓글알리미를 받지 못하는 것을 해결하는 방법입니다. 즉 example.com이라고만 적어도 댓글알리미를 받을 수 있게 하는 것이지요.

TC1.6부터 추가된 댓글알리미 백업 기능을 작성한 게 저입니다만 막상 제가 daybreaker.info/blog에 블로그를 운영하고 있고 댓글 달 때마다 daybreaker.info까지만 적어왔기 때문에 태터툴즈/텍스트큐브 블로그 운영 3년이 넘었음에도 테스트 데이터가 단 한 개도(-_-) 없다는 것이 디버깅의 걸림돌이었습니다.; 그래서 생각 난 김에 뿔도 뽑아버리자 하고 이 팁을 작성하게 되었습니다.

댓글알리미의 동작 원리

텍스트큐브의 댓글알리미는 해당 블로그 주소로 HTTP POST 요청을 보내어 interface/index.php가 POST 요청에 mode=fb라는 인자가 들어있는지 확인하여 댓글알리미 등록 함수를 호출하는 방식으로 이루어집니다. 트랙백처럼 댓글알리미용으로 존재하는 별도의 주소는 존재하지 않고 블로그 주소 자체가 댓글알리미 수신 주소가 되지요.

댓글알리미 Redirection 방법

다만 현재 텍스트큐브에서 공식적으로 지원하는 기능이 아니기 때문에 약간 복잡한 과정을 거쳐야 합니다.

  1. 먼저 웹디렉토리 루트에 다음과 같은 .htaccess 파일을 작성해야 합니다. 댓글알리미 요청은 POST method를 사용하여 전송되기 때문에 그냥 웹브라우저에 주소를 입력한 경우나 다른 곳에서 링크된 경우(이때는 GET method를 사용합니다)는 원래 홈페이지가 보여야 하니 그것을 필터링해주기 위한ㅈ것입니다.

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_METHOD} ^POST
    RewriteRule ^$ tc_commentnotify.php [QSA,L]
    </IfModule>
    
  2. 위에서 보신 것처럼 tc_commentnotify.php를 작성해야겠죠? (이 파일 이름은 원하시는대로 바꿔도 상관 없습니다.)

    <?php
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        if (!empty($_POST['mode']) && $_POST['mode'] = 'fb') {
            define('ROOT', './blog');
            include ROOT.'interface/index.php';
            exit;
        }
    }
    # To prevent unintended accesses
    header('HTTP/1.1 404 Not Found');
    echo 'This URL does not exist.';
    ?>
    
  3. 이 부분에 대해선 약간 논란의 여지가 있습니다만, 텍스트큐브 소스코드를 일부 고쳐야 제대로 동작합니다. lib/suri.php를 열어서 19번째 줄 즈음을 다음과 같이 고쳐주세요.

    if ($depth > 0) {
        if (preg_match('@^((/+[^/]+){' . $depth . '})(.*)$@', $url, $matches))
            $url = $matches[3];
        else { // 앞뒤로 중괄호를 쳐줍니다.
            // respond::NotFoundPage(); # 이 부분을 주석처리합니다.
            // Comment Notifier Customization Patch!
            $url = '/'; $depth = 0; $interfacePath='/';
        }
    }
    

    이 패치가 정식 버전에 적용될지, 아니면 다른 방식으로 구현될지는 아직 정해지지 않았습니다만 일단 댓글알리미가 급하신 분들은 저렇게 사용하셔도 큰 무리가 없을 것 같습니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
2008/04/07 20:56 2008/04/07 20:56
daybreaker 이 작성.

텍스트큐브 1.6부터는 단일 블로그의 경우에는 아파치의 mod_rewrite 를 사용하지 않아도 사용이 가능합니다. 이 경우 예쁜 주소 (http://example.com/entry/테스트글) 는 불가능하지만, 거의 비슷한 형식의 주소 (http://example.com/index.php?/entry/테스트글) 로 사용할 수 있습니다.

이렇게 변경되는 과정에서 텍스트큐브 설치 디렉토리 안의 모든 파일 접근을 텍스트큐브가 관리하기 때문에 기존에 사용하던 텍스트큐브 디렉토리 안의 다른 프로그램 (구글 사이트맵이나 통계용 플러그인) 들이 동작하지 않는 경우가 있습니다. 이 경우에는 텍스트큐브가 설치된 디렉토리 안의 .htaccess의 내용에 몇가지를 추가해서 그 문제를 해결할 수 있습니다.

예를 들어, 텍스트큐브 루트 디렉토리에 sitemap.php가 있는 경우 웹 주소를 통해서 접근하도록 하기 위해서는RewriteBase / 줄 바로 아랫줄에 다음의 두 줄을 추가합니다.

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(sitemap\.php) sitemap.php [L]

첫번째 줄은 그 아랫줄이 실행되기 위한 조건입니다. '만약 요청한 파일이 있다면'의 의미입니다. -f는 파일, -d는 디렉토리입니다. 그 다음줄은 '^(sitemap.php) 이 있으면 뒤의 파일로 이동하고 종료하라' 의 의미입니다. ^()은 정규식인데, 정규식에 관해서는 creorix님이 작성하시는 정규식 강좌를 참조하시면 됩니다.

응용해서, 두 개 이상의 파일일 경우를 작성해 보겠습니다.

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(sitemap\.php|statistics\.php) $1 [L]

sitemap.php이나 statistics.php가 있으면 그 파일을 실행하라~ 는 의미입니다. 정규식 대응때 $1, $2는 앞에 나온 조건의 괄호 하나하나에 차례대로 대응이 됩니다.

참 쉽죠?

이올린에 북마크하기(0) 이올린에 추천하기(0)
Writer profile
inureyes입니다. :p
2008/01/11 16:41 2008/01/11 16:41
inureyes 이 작성.

« Prev : 1 : 2 : 3 : 4 : 5 : ... 6 : Next »