2025년 12월 10일 수요일

검색 엔진 최적화(SEO)의 첫걸음[2] - 하나의 호스팅 서버에서 여러 DokuWiki 설치본의 Sitemap을 통합하는 방법

오늘 이 문제에 대해 너무 많은 고민과 공부를 했기에 '인간의 손'으로 그 지난한 과정을 반추하는 문서를 작성하기가 너무 힘들다. 그래서 본 문서의 중간 제목 이하는 챗GPT에게 자동 작성을 부탁하였다. '무지(無知)의 허물'을 한 세 개는 벗어난 것 같은데 나는 여전히 애벌래... 바로 직전에 쓴 글 검색 엔진 최적화(SEO)의 첫걸음[1]...에 꽤 많은 정보를 적었지만 결론적으로 별 소용이 없었고(지극히 효율이 떨어진다는 뜻), 그저 사이트맵 파일(sitemap.xml) 의 역할과 구글 서치 콘솔이라는 것이 무엇인지를 어렴풋하게 알게 된 것으로 그의미를 찾도록 하자. robots.txt는 검색 엔진 크롤러가 사이트의 어떤 부분을 크롤링할 수 있고, 어떤 부분은 크롤링하지 않아야 하는지를 서버 측에서 알려 주는 규칙 파일이다.  

별도로 설치된 위키 사이트에 대한 사이트맵이구글 서치 콘솔에서 잘 처리되었음을 보이고 있다. 오늘 작업의 최종 성적표에 해당한다.

사실 내 웹사이트가 검색에서 잘 노출이 되지 않는 것 같아서 유료 컨설팅을 받을까 하는 생각도 갖고 있었으나, 고민의 2/3 정도는 자체적으로 해결한 것 같다. 챗GPT에게 오늘의 교훈을 정리해 달라고 부탁하였다. 핵심적인 교훈 세 가지를 알아보자.

  1. DokuWiki의 설정에서 사이트맵 자체 생성 기능을 켜는 것이 시작이다.
  2. cron을 돌릴 필요가 없었다!
  3. 두 DokuWiki의 사이트맵 파일을 sitemap_index.xml로 통일하고, 이를 robots.txt에 기록한다.

개인 도메인과 위키 사이트 운영을 꽤 오랫동안 해 왔음에도 불구하고 늘 뭔가 꼬인것 같고 답답하던 기분을 오늘 많이 해소하였다. 아래는 자동 작성으로 쓴 글이고, 파란색 텍스트는 내가 나중에 추가한 것이다.

하나의 호스팅 서버에서 여러 DokuWiki 설치본의 Sitemap을 통합하는 방법
(Hostinger / SSH 없음 / 대표 URL = 루트 도메인)

이 글은 다음과 같은 실제 운영 환경을 기준으로 작성되었습니다. URL rewriting을 사용하여 위키 문서에는 눈에 보기 좋은 주소를 부여하였습니다.

  • 웹 호스팅: Hostinger (SSH 없음, .htaccess 사용 가능)
  • 웹서버: LiteSpeed (Apache Rewrite 호환)
  • 메인 Wiki 실제 설치 경로: https://genoglobe.com/dokuwiki
  • 사용자 대표 URL: https://genoglobe.com (루트 → /dokuwiki로 연결)
  • 두 번째 Wiki: https://genoglobe.com/kribb

목표

  • 각 Wiki가 자동 생성하는 sitemap.xml.gz을 외부에서 접근 가능하게 만들고,
  • 루트 도메인에서 통합 sitemap_index.xml을 제공하며,
  • Google Search Console에는 단 하나의 sitemap만 제출하는 구조를 만든다.

1. DokuWiki의 Sitemap 생성 기능 이해하기

DokuWiki는 conf/local.php에서 다음 설정을 하면 사이트맵을 자동 생성합니다.

$conf['sitemap'] = 1;

이 설정의 의미는 다음과 같습니다.

  • 각 Wiki에 대해 모든 문서를 포함하는 sitemap.xml.gz를 자동 생성
  • 생성 위치:
    • <dokuwiki>/data/cache/sitemap.xml.gz

예를 들어:

  • /public_html/dokuwiki/data/cache/sitemap.xml.gz
  • /public_html/kribb/data/cache/sitemap.xml.gz
  • 형식: gzip으로 압축된 표준 XML 사이트맵
  • 유지: DokuWiki 내부 CRON 메커니즘으로 자동 업데이트 (별도 서버 cron 불필요)

문제는 이 파일들이 있는 data 디렉터리가 기본적으로 외부에서 차단된다는 점입니다. [1]번 글에서는 cron을 사용하여 위키 문서 체계 안으로 사이트맵 파일을 매일 복사하는 무식한 방법을 사용하였으나, 전혀 그럴 필요가 없습니다. 그리고 그 글에서는 사이트맵 작성 역시 DokuWiki의 이러한 내장 기능을 쓰는 것도 아니었습니다.

(참고) DokuWiki의 각 페이지는 https://mydomain.com/dokuwiki/doku.php?id=mypage라는 복잡한 구조를 갖습니다. 이는 효율적인 크롤링이 되기 어렵습니다. 


2. data 디렉터리 보호 구조와 문제점

DokuWiki는 보안을 위해 data 디렉터리에 접근을 차단합니다. 기본 data/.htaccess 내용은 대략 다음과 같습니다.

<IfModule mod_authz_core.c>
    Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
</IfModule>
  • data/pages/, data/cache/ 등 대부분의 경로가 403 Forbidden
  • data/cache/sitemap.xml.gz도 예외 없이 막힌 상태

그래서 사이트맵을 생성해도 검색엔진이 가져갈 수 없는 구조가 됩니다.


3. sitemap.xml.gz만 예외적으로 공개하기 (data/.htaccess 수정)

보안은 유지하되, 오직 사이트맵 파일만 예외적으로 공개해야 합니다.

각 Wiki의 /data/.htaccess에 다음 블록을 deny 규칙보다 위에 추가합니다.

# Allow only sitemap.xml.gz (required for SEO)
<FilesMatch "sitemap\.xml\.gz$">
    <IfModule mod_authz_core.c>
        Require all granted
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Allow from all
    </IfModule>
</FilesMatch>

<IfModule mod_authz_core.c>
    Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
</IfModule>

결과

  • /dokuwiki/data/cache/sitemap.xml.gz → 200 OK
  • /dokuwiki/data/pages/... → 403 Forbidden (계속 보호)
  • /dokuwiki/data/cache/ 디렉터리 자체 → 403 Forbidden

kribb 위키(/public_html/kribb/data/.htaccess)에도 동일하게 적용합니다.


4. 각 Wiki의 sitemap.xml.gz를 외부 URL로 매핑하기

이제 내부 파일을 웹 URL로 노출해야 합니다.

4-1. 메인 Wiki (public_html/dokuwiki/.htaccess)

다음 내용을 추가합니다.

RewriteEngine on
RewriteRule ^sitemap\.xml\.gz$ data/cache/sitemap.xml.gz [L]

이제 다음 URL로 접근 가능해집니다.

https://genoglobe.com/dokuwiki/sitemap.xml.gz

4-2. kribb Wiki (public_html/kribb/.htaccess)

RewriteEngine on
RewriteRule ^sitemap\.xml\.gz$ data/cache/sitemap.xml.gz [L]

접근 가능 URL:

https://genoglobe.com/kribb/sitemap.xml.gz

5. 루트 도메인에서 메인 Wiki의 sitemap.xml.gz 노출

운영상 대표 URL은 https://genoglobe.com 이므로, 메인 사이트맵도 다음 경로에 있는 것이 자연스럽습니다.

https://genoglobe.com/sitemap.xml.gz

이를 위해 public_html/.htaccess 에 다음을 추가합니다.

RewriteEngine on
RewriteRule ^sitemap\.xml\.gz$ dokuwiki/data/cache/sitemap.xml.gz [L]

이제 다음 요청이 정상 동작합니다.

https://genoglobe.com/sitemap.xml.gz  →  dokuwiki/data/cache/sitemap.xml.gz

6. 여러 사이트맵을 묶는 sitemap_index.xml 만들기

메인 Wiki와 kribb Wiki 두 개의 사이트맵을 하나로 묶기 위해 인덱스 사이트맵을 만듭니다.

파일 위치: public_html/sitemap_index.xml

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

   <sitemap>
      <loc>https://genoglobe.com/sitemap.xml.gz</loc>
   </sitemap>

   <sitemap>
      <loc>https://genoglobe.com/kribb/sitemap.xml.gz</loc>
   </sitemap>

</sitemapindex>

이 파일이 이제 전체 사이트맵의 “대표” 역할을 합니다.


7. robots.txt에 인덱스 사이트맵 등록

루트( public_html/robots.txt )에 다음 내용을 둡니다.

User-agent: *
Disallow:

Sitemap: https://genoglobe.com/sitemap_index.xml

검색엔진은 이 인덱스 파일을 읽어 내부의 개별 사이트맵들을 자동으로 추적합니다.


8. Google Search Console에 제출할 주소

이제 제출해야 할 사이트맵은 단 하나입니다.

https://genoglobe.com/sitemap_index.xml

GSC에서 Sitemaps 메뉴에 들어가 입력란에 sitemap_index.xml만 입력하고 제출하면,

  • 메인 Wiki의 사이트맵 (https://genoglobe.com/sitemap.xml.gz)
  • kribb Wiki의 사이트맵 (https://genoglobe.com/kribb/sitemap.xml.gz)

을 모두 자동으로 읽어 인덱싱하게 됩니다.


9. curl로 최종 점검하기 (WSL / PowerShell)

WSL이나 PowerShell에서 다음과 같이 점검할 수 있습니다.

메인 사이트맵:

curl -I https://genoglobe.com/sitemap.xml.gz

kribb 사이트맵:

curl -I https://genoglobe.com/kribb/sitemap.xml.gz

data 디렉터리 보호 상태:

curl -I https://genoglobe.com/dokuwiki/data/pages/
curl -I https://genoglobe.com/kribb/data/pages/

sitemap 인덱스 파일:

curl -I https://genoglobe.com/sitemap_index.xml
  • sitemap.xml.gz, kribb/sitemap.xml.gz, sitemap_index.xml → 200 OK
  • data/pages/... → 403 Forbidden

이렇게 나오면 구조가 완전히 정상입니다. 이 과정을 반드시 거쳐서 의도한 대로 작동을 하는지, 보안에 문제는 없는지 점검해야 합니다.


10. 최종 구조 요약

https://genoglobe.com/              → 대표 URL (실제는 /dokuwiki/)
https://genoglobe.com/sitemap.xml.gz        → 메인 Wiki sitemap
https://genoglobe.com/kribb/sitemap.xml.gz  → kribb Wiki sitemap
https://genoglobe.com/sitemap_index.xml     → 통합 인덱스 사이트맵
  • $conf['sitemap'] = 1; 설정으로 각 Wiki가 자동으로 sitemap.xml.gz 생성
  • data/.htaccess에서 sitemap.xml.gz만 예외적으로 허용
  • 각 Wiki와 루트에서 RewriteRule로 사이트맵을 깔끔하게 노출
  • 통합 sitemap_index.xml과 robots.txt 구성을 통해 GSC에는 하나만 제출
  • 추가 cron 없이 DokuWiki 자체 기능만으로 유지 가능

결과적으로 이 구성은 SSH 없이도 구현 가능한, 여러 개의 DokuWiki 설치본을 하나의 루트 도메인 아래에서 검색엔진 친화적으로 통합 운영하는 방법이라고 할 수 있습니다.

댓글 없음: