Jekyll feed.xml 최소화하기

RSS는 매우 오래된 기술이지만, 아직까지도 많은 웹 서비스에서 지원하고 사용되는 기술입니다. 일반 사용자가 리더를 통해 쉽게 글 목록을 받아서 읽을 수 있고, SEO 관점에서도 상당히 중요한 부분입니다.

다만 간혹 이를 이용해서 자동으로 본문을 퍼나르는 비도덕적인 서비스가 있기 마련입니다. (평소라면 별로 신경 안썼지만, 저의 원글은 검색 노출이 없고 퍼나르는 중국 서비스가 상위에 있다보니 약간 짜증이 났네요..)

그래서 이를 방지하기 위해서 몇가지 대책을 적용해봤었고 오늘은 그 내용, 즉 jekyll에서 feed의 노출을 최소화하는 방법에 대한 이야기를 하려고 합니다.

Description 길이 자르기 (truncate / truncatewords)

Jekyll에서 기본적으로 제공하는 Liquid 중에는 문자열을 잘라낼 수 있는 truncatetruncatewords 가 있습니다. 이는 각각 truncate는 지정된 길이만큼 자르고, truncatewords는 단어 기반으로 잘라낸다는 특징이 있죠. 이를 활용하면 feed 내 모든 본문정보를 넘겨주지 않을 수 있습니다.

truncate

input

{{ "Ground control to Major Tom." | truncate: 20 }}

output

Ground control to...

truncatewords

input

{{ "Ground control to Major Tom." | truncatewords: 3 }}

output

Ground control to...

in feed.xml

<description>{{ post.content | truncatewords: 200 | xml_escape }}</description>

Description 포맷 변경하기 (HTML to Plain)

사실 이게 좋은 방법인지는 모르겠으나, HTML 기반의 Description을 Plain으로 바꿀 수도 있습니다. 이게 막상 ruby로 코드를 넣으려고 하면 좀 번거로울 수 있겠구나 싶지만, 다행히도 strip_html 이라는 Liquid가 있습니다.

strip_html

input

{{ "Have <em>you</em> read <strong>Ulysses</strong>?" | strip_html }}

output

Have you read Ulysses?

어차피 본문 노출의 길이 또한 조절했다면, RSS Feed 구독자를 생각한건 아니니 과감하게 빼줘봅시다.

in feed.xml

<description>{{ post.content | strip_html | truncatewords: 200 | xml_escape }}</description>

최종 feed.xml

---
---
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>{{ site.title | xml_escape }}</title>
    <description>{{ site.description | xml_escape }}</description>
    <link>{{ site.url }}{{ site.baseurl }}/</link>
    <atom:link href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" rel="self" type="application/rss+xml"/>
    <pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
    <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
    {% for post in site.posts limit:30 %}
      <item>
      <title>{{ post.title | xml_escape }}</title>
        <description>{{ post.content | strip_html | truncatewords: 200 | xml_escape }}</description>
        <pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
        <link>{{ post.url | prepend: site.baseurl | prepend: site.url }}</link>
        <guid isPermaLink="true">{{ post.url | prepend: site.baseurl | prepend: site.url }}</guid>
        {% for tag in post.tags %}
        <category>{{ tag | xml_escape }}</category>
        {% endfor %}
        {% for cat in post.categories %}
        <category>{{ cat | xml_escape }}</category>
        {% endfor %}
      </item>
    {% endfor %}
  </channel>
</rss>

Conclusion

일단은 feed.xml을 좀 조정한 상태인데, 검색 엔진의 노출 결과를 지켜보긴 해야할 것 같습니다. 아무래도 본문 전체를 노출할 때 보단 검색 엔진이 얻어가는 정보가 적어져서 SEO 측면에선 조금 불리한면이 있을 것 같단 생각이 듭니다.

References