오늘 이 문제에 대해 너무 많은 고민과 공부를 했기에 '인간의 손'으로 그 지난한 과정을 반추하는 문서를 작성하기가 너무 힘들다. 그래서 본 문서의 중간 제목 이하는 챗GPT에게 자동 작성을 부탁하였다. '무지(無知)의 허물'을 한 세 개는 벗어난 것 같은데 나는 여전히 애벌래... 바로 직전에 쓴 글 검색 엔진 최적화(SEO)의 첫걸음[1]...에 꽤 많은 정보를 적었지만 결론적으로 별 소용이 없었고(지극히 효율이 떨어진다는 뜻), 그저 사이트맵 파일(sitemap.xml) 의 역할과 구글 서치 콘솔이라는 것이 무엇인지를 어렴풋하게 알게 된 것으로 그의미를 찾도록 하자. robots.txt는 검색 엔진 크롤러가 사이트의 어떤 부분을 크롤링할 수 있고, 어떤 부분은 크롤링하지 않아야 하는지를 서버 측에서 알려 주는 규칙 파일이다.
| 별도로 설치된 위키 사이트에 대한 사이트맵이구글 서치 콘솔에서 잘 처리되었음을 보이고 있다. 오늘 작업의 최종 성적표에 해당한다. |
사실 내 웹사이트가 검색에서 잘 노출이 되지 않는 것 같아서 유료 컨설팅을 받을까 하는 생각도 갖고 있었으나, 고민의 2/3 정도는 자체적으로 해결한 것 같다. 챗GPT에게 오늘의 교훈을 정리해 달라고 부탁하였다. 핵심적인 교훈 세 가지를 알아보자.
- DokuWiki의 설정에서 사이트맵 자체 생성 기능을 켜는 것이 시작이다.
- cron을 돌릴 필요가 없었다!
- 두 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 Forbiddendata/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 OKdata/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 설치본을 하나의 루트 도메인 아래에서 검색엔진 친화적으로 통합 운영하는 방법이라고 할 수 있습니다.
댓글 없음:
댓글 쓰기