Hugo Exclude Pages

Sitemap.xml에 컨텐츠가 없는 페이지는 제외하는 설정을 진행합니다.

Introduction

Hugo로 블로그를 만들어서 운영중인데요. 구글 서치콘솔에 sitemap.xml을 제출수 검색에 노출되게끔 설정해두었습니다.
그런데 몇달이 지난 지금도 색인된 페이지가 몇 개가 되지않습니다.
글이 적은걸 고려하더라도, 이해하기 어려운 수치여서 살펴보았습니다.

search_console_pages

색인되지 않은 페이지들은 대다수가 categories와 tags로 생성된 페이지 였습니다.
몇달째 이 상태가 유지된다는건, 색인 대상에서 제외(?) 되는거 아닐까 라는 생각이 들었습니다.
이러면 정상적인 글까지도 색인 되지않게 되는거라 추가 조치를 취하기로 마음 먹었습니다.

Objective

구글에서 수집할 페이지들을 보는 페이지(sitemap.xml)에서 불필요한 글들을 대상에서 제외한다.

How

Hugo는 사용중인 설정파일에만 추가해주면, sitemap을 자동으로 생성해 줍니다.
(설정에 대한 가이드는 링크에서 확인하실수 있습니다.)

이 설정대로 사용할 경우, categories와 tags가 sitemap.xml에 포함되어 출력되기 떄문에 custom해 주어야 합니다.
override built-in template을 읽어보면, custom 하는 방법을 상세히 안내하고 있습니다.
정리하면 아래와 같이 2개 중 하나의 파일만 만들어주면 됩니다.

1
2
- layouts/sitemap.xml
- layouts/_default/sitemap.xml

저의 경우에는 default로 만드는 것에 왠지 모를 거부감(?)이 느껴져서 layouts/sitemap.xml로 만들었습니다.
만든 sitemap.xml에서 어떻게 내용을 구성하면 되는지 작성해주면 되는데요.
Hugo가 Golang으로 만들어졌기 때문에, HTML을 만들기 위한 golang template language 문법에 맞게 sitemap.xml을 작성하면 됩니다.

번거로우니까 우선 결론부터 이야기하면 sitemap.xml은 아래의 내용처럼 추가해주시면 됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
    {{ range .Pages }}
    {{ if not (in .Site.Params.taxonomiesExcludedFromSitemap .Data.Plural) }}
    <url>
        <loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
        <lastmod>{{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ end }}{{ with .Sitemap.ChangeFreq }}
        <changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Sitemap.Priority 0.0 }}
        <priority>{{ .Sitemap.Priority }}</priority>{{ end }}{{ if .IsTranslated }}{{ range .Translations }}
        <xhtml:link
                rel="alternate"
                hreflang="{{ .Language.Lang }}"
                href="{{ .Permalink }}"
        />{{ end }}
        <xhtml:link
                rel="alternate"
                hreflang="{{ .Language.Lang }}"
                href="{{ .Permalink }}"
        />{{ end }}
    </url>
    {{ end }}
    {{ end }}
</urlset>

{{ if not (in .Site.Params.taxonomiesExcludedFromSitemap .Data.Plural) }} 라는 부분이 노출제어하는 역할을 수행합니다.

첫번째 변수(.Site.Params.taxonomiesExcludedFromSitemap)는 Site Variable을 사용합니다.
Site Variable은 쉽게 생각하면 Global Variable 역할을 맡는다고 합니다.
여기서 Params라는 변수게 접근이 가능한데 관련된 내용은 링크로 확인할 수 있습니다.
.Site.Params 변수를 사용하면 config 파일에 params 에 접근할 수 있습니다.
이 말은 params에 있는 taxonomiesExcludedFromSitemap 변수에 접근하겠다는 뜻이죠.

config.yaml에 추가한 적이 없기 때문에, 노출제어를 하기 위해서는 추가해주어야 합니다.
(config.yaml또는 config.toml에 아래 내용을 추가해주세요)

1
2
3
4
params:
    taxonomiesExcludedFromSitemap:
        - "tags"
        - "categories"

두번째 변수는 Taxonomy Variable을 사용합니다.
이걸 찾아볼때 까지 Taxonomy가 무엇인지 몰랐습니다… 간단히 정리하면 User가 정의하는 Grouping 방법입니다.
(자세히 알고싶은 분은 링크를 한번 읽어보면 좋을것 같습니다.)

변수 설명페이지를 보면 .Data.Plural은 분류법의 복수 이름이라고 정의하고 있습니다.
노출제어하고 싶은 페이지들에 해당되는 변수임을 알 수 있습니다.


yaml파일 수정과 sitemap.xml추가까지 했다면, 필요한 조치들은 모두 수행하였습니다.
local에서 sitemap이 의도한 대로 변경되었는지 확인하고 배포하시면 되겠습니다.

Conclusion

생각보다 어려운 작업은 아니었지만, Hugo의 설정 관련 문서들을 찾기가 조금 어려웠습니다.
아직은 Document 구성이 익숙하지 않아 그런것 같아, 앞으로 블로그를 운영해나가면서 익숙해져 나가야겠습니다.

감사합니다.

Reference

Licensed under CC BY-NC-SA 4.0
Hugo로 만듦
JimmyStack 테마 사용 중