最近剛好在處理 Sitemap 的問題,如果有在做 SOE 的朋友應該都知道 Sitemap 的重要性,他可以為搜索引擎的蜘蛛提供瀏覽整個網站的連結,藉此讓搜尋引擎更認識你的網站,後來就想在自己的部落格來玩玩看,就找到這個方法,不使用任何 Jekyll 套件,就能輕鬆產出 sitemap.xml。

因為我的部落格是使用 Github Pages 的服務,所以 Jekyll 是執行 --safe 模式,因此也不能使用客製套件

Sitemap 格式

sitemap.xml 裡面包含網站內的各個連結,他有個固定的格式,如下:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://poychang.github.io/generating-sitemap-in-jekyll-without-plugin/</loc>
        <lastmod>2017-04-27T23:42:00+08:00</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.5</priority>
    </url>
</urlset>

Sitemap 必須符合以下條件:

  • 以起始 <urlset> 標記做為開頭,並以結束 </urlset> 標記結束
  • 指定 <urlset> 內的名稱領域 (通訊協定標準)
  • 讓每個 URL 中包含一個 <url> 項目做為母層 XML 標記
  • 在每個 <url> 母層標記包含一個 <loc> 子層項目

每一組 <url> 就代表一個頁面,其中屬性說明如下:

  • loc 網頁的 URL
  • lastmod 檔案的最後修改日期
  • changefreq 網頁可能變更的頻率,有效值如下:
    • always
    • hourly
    • daily
    • weekly
    • monthly
    • yearly
    • never
  • priority 此 URL 相對於您網站上的其他 URL 的優先順序,有效值從 0.0 到 1.0

自動產生 sitemap.xml 內容

在 Jekyll 我們可以透過 {% for post in site.posts %} 來遍巡文章,或 {% for page in site.pages %} 來遍尋頁面,藉此取得各頁面的 metadata,然後寫入 xml 中,因此可以在 jekyll 專案裡面建立一個 sitemap.xml 檔案,內容如下:

透過上面的程式碼,我們可以在部落格文章(post)或頁面(page)中,使用下列 metadata 來提供或修改相關資訊,格式如下:

sitemap:
  lastmod: 2014-01-23
  priority: 0.7
  changefreq: 'monthly'
  exclude: 'yes'

補充說明

在 Google Search Console 的提交 Sitemap 說明文件中提到, Sitemap 檔案要使用 UTF-8 編碼,如果遇到下列字元,需轉換成溢出碼。

字元 逸出碼
& 符號 &amp;
單引號 &apos;
雙引號 &quot;
大於 &gt;
小於 &lt;

參考資料:


Poy Chang

Trial and Error