Panduan Jekyll SEO

cara mengoptimalkan Jekyll situs untuk penelusuran — mengapa -nya static HTML adalah crawler-friendly oleh default, plus jekyll-seo-tag dan jekyll-sitemap plugins, permalinks, collections, robots.txt, dan GitHub halaman plugin whitelist.

Pertama kali diterbitkan: 26 Jun 2026 · Terakhir diperbarui: 3 Agu 2026 · Lanjutan
1 sinyal bukti di halaman ini

Jekyll outputs flat, static HTML — crawler mendapatkan menyelesaikan konten pada pertama fetch, dengan Tidak JavaScript rendering delay. So SEO berfungsi tidak fighting kerangka kerja; ini adalah configuration. Install jekyll-seo-tag (judul, deskripsi, canonical, Open Graph, Twitter Card, JSON-LD) dan jekyll-sitemap (sitemap.xml), dan set url: di _config.yml atau keduanya produce rusak output. Pick bersih permalinks (/:judul/, tidak date-based) untuk evergreen konten. buat robots.txt yourself — Jekyll tidak akan. Watch dua GitHub halaman traps: plugin whitelist (hanya sebuah fixed set berjalan tanpa sebuah GitHub tindakan bangun) dan baseurl misconfiguration pada project situs, yang breaks setiap canonical URL.

TL;DR — Jekyll emits flat static HTML di bangun time, so konten adalah di mentah respons pada pertama crawl — Tidak Web rendering Service, Tidak Wave 2 delay. SEO berfungsi adalah configuration, tidak architecture. Install jekyll-seo-tag (judul, deskripsi, canonical, OG, Twitter Card, JSON-LD) dan jekyll-sitemap (sitemap.xml); keduanya memerlukan url: di _config.yml atau mereka produce rusak output. gunakan bersih permalinks (/:title/) di atas date-based ones untuk evergreen konten. Dua GitHub halaman traps dominate: plugin whitelist (GitHub membangun dengan --safe; non-whitelisted plugins perlu sebuah GitHub tindakan bangun) dan sebuah missing baseurl pada project situs, yang breaks setiap generated canonical URL. GitHub halaman juga pins spesifik plugin versi (3.10.0 core, older jekyll-seo-tag/jekyll-sitemap releases), tidak hanya yang plugins jalankan. Collections perlu output: true atau mereka’re tidak pernah dirender. Drafts, future-dated posts, dan published: false documents adalah excluded dari sebuah wajar bangun, dan --incremental adalah experimental — jangan gunakan ini untuk production deploys. dan robots.txt adalah tidak auto-generated — membuat ini yourself.

Mengapa Jekyll’s static output adalah baik untuk SEO

Jekyll adalah sebuah static situs generator: ini berjalan Anda Markdown dan Liquid templates melalui sebuah bangun langkah dan emits finished HTML, setelah, sebelum apa pun permintaan. itu timing adalah seluruh SEO advantage. Bukti untuk klaim ini Jekyll processes text and templates into static files during a build. Cakupan: Jekyll build architecture. Tingkat keyakinan: tinggi · Diverifikasi: Jekyll documentation

Google’s pipeline adalah crawl → render → indeks, dan rendering JavaScript adalah “a terpisah step” (terjemahan) “sebuah terpisah langkah” itu sits di sebuah queue — apa orang loosely panggil “dua-wave” (terjemahan) “dua-wave” proses. Wave 1 fetches mentah HTML dan indeks text dan tautan immediately; Wave 2 queues halaman untuk Web rendering Service untuk jalankan JavaScript, “beberapa seconds untuk weeks” (terjemahan) “sebuah sedikit seconds untuk weeks” kemudian depending pada anggaran crawling. dengan Jekyll, Wave 1 sudah berisi semua Anda konten — ada Tidak JavaScript diperlukan untuk render body. Wave 1 = Wave 2. Tidak rendering delay, Tidak rendering budget spent. ini adalah yang sama argument itu membuat apa pun static situs generator lowest-risk architecture untuk indexability.

downstream benefits ikuti:

  • Lebih cepat TTFB. Pre-dibangun files disajikan dari sebuah CDN (GitHub halaman sits behind Fastly; Netlify/Vercel memiliki mereka own edges) berarti Tidak database kueri dan Tidak server processing — baik untuk LCP dan rest dari Core Web Vitals.
  • Tidak diperlukan JS payload untuk konten → better FCP dan LCP daripada sebuah hydrating SPA.
  • Proper HTTP kode status di CDN layer, tidak client-side error menangani.

tetapi none dari itu perubahan fundamentals: static situs masih perlu meta tags, sitemaps, canonical URLs, data terstruktur, dan baik konten. Jekyll’s output adalah crawler-friendly; metadata adalah pada Anda.

GitHub halaman dan Jekyll SEO

paling umum Jekyll deployment adalah GitHub halaman — push untuk sebuah branch dengan halaman enabled dan GitHub auto-membangun situs. itu convenience muncul dengan SEO-relevant constraints.

Project situs vs. pengguna/org situs — URL decision

  • username.github.io/repo-name (sebuah project situs) lives pada sebuah shared subdomain dengan thousands dari lainnya unrelated situs. ini berfungsi fine untuk docs, demos, dan personal projects di mana URL itself tidak perlu untuk carry Anda brand.
  • sebuah custom domain (poin sebuah CNAME di GitHub halaman) puts situs pada sebuah URL Anda control, dengan HTTPS auto-provisioned oleh GitHub. untuk sebuah situs di mana domain itself penting — sebuah business situs, sebuah blog Anda’re membangun sebuah audience sekitar — sebuah custom domain dari mulai menghindari sebuah domain migration kemudian.

jika Anda expect untuk move untuk sebuah custom domain eventually, set ini up early. apa pun domain migration berarti 301 redirects (jekyll-redirect-from menangani ini) dan sebuah period di mana inbound tautan dan apa pun accumulated sinyal poin di old URL — avoidable churn jika Anda pick akhir domain up front alih-alih switching kemudian. ini adalah sebuah migration-planning argument, tidak sebuah claim itu sebuah github.io subdomain adalah penalized pada -nya own.

baseurl — #1 canonical bug pada project situs

Project situs langsung di bawah sebuah subfolder (/repo-name/). jika Anda tidak set baseurl: /repo-name di _config.yml, setiap canonical URL jekyll-seo-tag generates — dan Anda tautan internal — akan menjadi wrong, missing subfolder. ini adalah single sebagian besar umum canonical-URL bug pada Jekyll project situs. (pengguna/org situs disajikan di domain root jangan perlu baseurl.)

plugin whitelist

GitHub halaman berjalan Jekyll dengan --safe flag dan hanya memungkinkan sebuah fixed set dari plugins. Bukti untuk klaim ini GitHub Pages builds Jekyll in safe mode and supports a documented set of plugins. Cakupan: GitHub Pages hosted builds. Tingkat keyakinan: tinggi · Diverifikasi: GitHub Pages: Jekyll plugins SEO-relevant whitelisted ones:

  • jekyll-seo-tag ✓
  • jekyll-sitemap ✓
  • jekyll-redirect-from ✓ (untuk 301s ketika Anda perubahan URLs)
  • jekyll-paginate ✓

Tidak whitelisted (dan silently tidak akan jalankan, atau akan error):

  • jekyll-last-modified-at — needed untuk accurate sitemap <lastmod> dari file timestamps
  • Custom structured-data plugins
  • Apa pun dropped di sebuah _plugins/ folder

ini adalah tidak hanya yang plugins — ini adalah yang versi

GitHub halaman tidak hanya restrict yang plugins jalankan; ini pins tepat versi dari setiap satu, dan itu bangun environment itself adalah pinned untuk sebuah older Jekyll. sebagai dari dependency list’s terakhir perbarui, hosted bangun berjalan Jekyll 3.10.0 dengan jekyll-seo-tag 2.8.0, jekyll-sitemap 1.4.0, dan jekyll-feed 0.17.0 — sementara jekyllrb.com’s own docs deskripsikan saat ini upstream rilis, 4.4.1. sebuah perilaku terdokumentasi di sebuah plugin’s latest README tidak guaranteed untuk exist di versi GitHub halaman sebenarnya berjalan; periksa pages.github.com/versions.json untuk pinned versi sebelum relying pada sebuah spesifik flag atau output. sebuah GitHub tindakan bangun sidesteps ini too — Anda control Gemfile, so Anda mendapatkan versi Anda pin, tidak GitHub’s.

GitHub tindakan workaround

perbaiki untuk whitelist tidak “add more gems” (terjemahan) “tambahkan lebih gems” — ini adalah untuk berhenti letting GitHub melakukan bangun. Jalankan Jekyll yourself di CI (actions/jekyll-build-pages, atau bangun locally dan push _site/ untuk deploy branch dengan peaceiris/actions-gh-pages) dan whitelist Tidak lebih lama applies. Now apa pun plugin berjalan, dan Anda pick Jekyll dan plugin versi alih-alih inheriting GitHub’s pinned set.

jekyll-seo-tag plugin

ini adalah official, maintained plugin itu covers sebagian besar dari core metadata Jekyll tidak tambahkan pada -nya own. Persis apa ini emits bergantung pada yang versi Anda memiliki installed, Anda _config.yml dan front penting, dan apakah Anda layout sebenarnya panggilan {% seo %} — GitHub halaman, misalnya, pins sebuah spesifik versi alih-alih selalu shipping latest rilis (lebih pada itu di bawah). periksa advanced usage guide untuk Anda versi’s tepat output, dan konfirmasi apa sebenarnya landed oleh grepping Anda own dibangun HTML alih-alih assuming ini adalah menyelesaikan.

Install:

# Gemfile
gem 'jekyll-seo-tag'
# _config.yml
plugins:
  - jekyll-seo-tag
<!-- _layouts/default.html, before </head> -->
{% seo %}

Apa ini generates secara otomatis:

  • <title> — halaman judul dengan situs name appended (Page Title | Site Name)
  • <meta name="description"> — dari description: front penting atau situs deskripsi
  • <link rel="canonical"> — dibangun dari site.url + page.url
  • Open Graph tags (og:title, og:description, og:url, og:site_name, og:image)
  • Twitter Card tags (twitter:card, twitter:title, twitter:description, twitter:creator, twitter:image)
  • JSON-LD data terstruktur (BlogPosting untuk posts, WebSite untuk home halaman)
  • Pagination meta (berikutnya/prev URLs)

diperlukan _config.yml settings — tanpa ini plugin produces rusak output:

title: Your Site Title
description: Your site description
url: "https://yourdomain.com"   # CRITICAL — drives canonical URL generation
author:
  name: Patrick Stox
  twitter: patrickstox
  url: https://patrickstox.com  # author disambiguation
twitter:
  username: patrickstox
  card: summary_large_image

Per-halaman front penting overrides:

---
title: "Jekyll SEO Guide"
description: "How to optimize Jekyll sites for search engines."
image:
  path: /assets/jekyll-seo-og.png
  width: 1200
  height: 630
  alt: "Jekyll SEO diagram"
canonical_url: "https://example.com/jekyll-seo/"  # override if needed
robots: noindex   # per-page noindex
seo:
  type: BlogPosting          # schema.org type override
  date_modified: 2025-01-15  # dateModified override for JSON-LD
---

Suppression (ketika Anda layout sudah outputs -nya own):

{% seo title=false %}      <!-- suppress the <title> -->
{% seo canonical=false %}  <!-- suppress the canonical link -->

Satu gotcha worth flagging: banyak minimal themes (including minima) ship tanpa jekyll-seo-tag wired di. menambahkan gem untuk Anda Gemfile melakukan tidak ada apa pun unless theme’s layout sebenarnya panggilan {% seo %}.

Sitemaps dengan jekyll-sitemap

sama install pattern (Gemfile + _config.yml). ini generates sebuah sitemaps.org- compliant sitemap.xml di /sitemap.xml pada setiap bangun.

ini memerlukan url: di _config.yml — tanpa ini, sitemap entries memiliki Tidak domain.

Controlling <lastmod>, di priority order:

  1. last_modified_at: di front penting (best — jelas control)
  2. Post creation date (fallback — sering wrong untuk evergreen konten diperbarui kemudian)
  3. Filesystem modification date (perlu non-whitelisted jekyll-last-modified-at)

Best practice: tambahkan last_modified_at: YYYY-MM-DD untuk setiap post, dan bump ini ketika Anda perbarui konten — itu’s freshness sinyal recrawl prioritization leans pada.

Excluding halaman:

# Per-page front matter
sitemap: false

# Global pattern (in _config.yml)
defaults:
  - scope:
      path: "assets/**/*.pdf"
    values:
      sitemap: false

Permalinks adalah set globally di _config.yml atau overridden per halaman di front penting.

StylePatternSEO notes
date (default)/:categories/:year/:month/:day/:title.htmlDate-berat, fragile jika post date perubahan
pretty/:categories/:year/:month/:day/:title/Trailing slash, Tidak .html
none/:categories/:title.htmlTidak date burial
Custom/:title/ atau /:categories/:title/sebagian besar control — recommended untuk evergreen konten

Recommended untuk sebagian besar situs:

permalink: /:title/
# or
permalink: /:categories/:title/

Mengapa hindari date-based URLs untuk evergreen posts:

  • Mengubah sebuah post’s date: front penting perubahan -nya URL → inbound tautan break.
  • Deep hierarchy (/2019/03/14/post-title/) buries konten untuk Tidak alasan.
  • (untuk news dan journalism, date URLs adalah fine dan yang diharapkan — ini adalah sebuah per-context panggil, tidak sebuah universal aturan.)

Collections perlu mereka own permalink config:

collections:
  case_studies:
    output: true
    permalink: /case-studies/:name/

sebuah warning pada mengubah patterns: setelah URLs adalah terindeks, switching permalink styles memerlukan 301 redirects (gunakan jekyll-redirect-from). Skip redirects dan Anda break tautan equity dan generate 404s di Search Console.

Collections dan SEO

Collections adalah Jekyll’s custom konten jenis beyond posts dan halaman — docs bagian, portfolio items, team members, case studies, FAQs. Dua requirements membuat atau break mereka SEO:

  1. output: true harus menjadi set. Tanpa ini, collection documents adalah tidak pernah dirender sebagai individual HTML files dan karena itu dapat’t menjadi terindeks. ini adalah sebuah silent pengindeksan killer — konten ada di Anda repo tetapi tidak pernah becomes sebuah dapat di-crawl halaman.

    collections:
      docs:
        output: true          # REQUIRED for indexable pages
        permalink: /docs/:name/
  2. setiap document perlu front penting — bahkan sebuah empty --- block. Tanpa ini, Jekyll memperlakukan file sebagai sebuah binary static file: Tidak Liquid processing, Tidak metadata, Tidak jekyll-seo-tag integration.

Note itu collections tidak disertakan di RSS feeds (hanya posts adalah). untuk besar documentation situs, collections adalah biasanya right structure anyway.

Penerbitan status dan incremental membangun

Jekyll memiliki several independent switches itu control apa sebenarnya ends up di dibangun situs. Mixing them up produces either halaman itu silently tidak pernah mendapatkan dibangun, atau draft/future konten itu ships untuk production oleh accident:

  • Drafts (_drafts/) adalah excluded dari sebuah wajar bangun entirely. mereka hanya muncul ketika Anda jalankan bundle exec jekyll serve --drafts (atau build --drafts) locally — moving sebuah post ke _posts/ dengan sebuah nyata date adalah apa sebenarnya publishes ini.
  • Future-dated posts (sebuah date: kemudian daripada saat ini time) adalah excluded oleh default. future: true di _config.yml, atau --future flag, mencakup them — handy untuk local preview, tetapi leaving ini pada di sebuah production config berarti scheduled posts go langsung moment Anda bangun, tidak pada mereka yang dimaksud date.
  • published: false di front penting excludes sebuah document dari bangun regardless dari -nya date — sebuah terpisah switch dari drafts dan future posts, dan easy untuk leave set setelah testing sebuah halaman Anda dimaksudkan untuk ship.
  • Incremental regeneration (--incremental) adalah terdokumentasi oleh Jekyll sebagai experimental, dan ini tracks sebuah limited dependency graph — mainly mencakup dan layouts. sebuah halaman itu iterates site.posts atau lainnya collection data (sebuah tag indeks, sebuah archive, related-posts logic) dapat go stale di bawah --incremental tanpa Jekyll detecting itu underlying posts changed. jangan jalankan ini sebagai bagian dari sebuah production deploy; gunakan penuh bundle exec jekyll build untuk apa pun Anda’re pushing langsung.

sebelum trusting apa pun dari ini, bangun tanpa flags Anda gunakan locally (--drafts, --future, --incremental) dan konfirmasi output di _site/ matches apa Anda intend untuk publish — safest default untuk sebuah deploy pipeline adalah sebuah bersih, penuh, non-incremental bangun.

Custom head partials dengan Liquid

Ketika jekyll-seo-tag tidak cukup, Anda bangun Anda own _includes/head.html:

<head>
  <meta charset="UTF-8">
  <title>
    {% if page.title %}{{ page.title }} | {{ site.title }}
    {% else %}{{ site.title }}{% endif %}
  </title>
  <meta name="description" content="
    {%- if page.description -%}{{ page.description }}
    {%- elsif page.excerpt -%}{{ page.excerpt | strip_html | strip_newlines }}
    {%- else -%}{{ site.description }}
    {%- endif -%}">
  <link rel="canonical" href="{{ page.url | prepend: site.url }}">
  {% seo %}
</head>

Key Liquid filters untuk SEO:

  • | strip_html — menghapus tags dari sebuah auto-excerpt (essential untuk bersih deskripsi)
  • | strip_newlines — menghapus line breaks dari excerpts
  • | truncate: 160 — sebuah opsional template-side character cap, tidak sebuah Google limit. Prefer sebuah authored, halaman-spesifik deskripsi dan preview dirender snippet; fit varies oleh kueri, device, language, dan script.
  • | prepend: site.url — membangun absolute URLs untuk canonical dan OG tags
  • | date_to_xmlschema — ISO 8601 dates untuk JSON-LD datePublished/dateModified
  • | default: fallback — fallback ketika sebuah variable adalah nil

Custom JSON-LD beyond apa jekyll-seo-tag emits:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": {{ page.title | jsonify }},
  "datePublished": "{{ page.date | date_to_xmlschema }}",
  "dateModified": "{{ page.last_modified_at | default: page.date | date_to_xmlschema }}",
  "author": {
    "@type": "Person",
    "name": "{{ page.author.name | default: site.author.name }}",
    "url": "{{ page.author.url | default: site.author.url }}"
  }
}
</script>

robots.txt adalah tidak auto-generated

Jekyll melakukan tidak buat robots.txt. Anda membuat ini yourself di situs root. sertakan sebuah empty front-penting block so Liquid memproses file (so {{ site.url }} resolves):

---
---
User-agent: *
Allow: /

Sitemap: {{ site.url }}/sitemap.xml

Tanpa ini, ada Tidak sitemap reference di robots.txt — dan beberapa crawler gunakan itu sebagai sebuah penemuan mechanism. (robots.txt controls crawling, tidak pengindeksan — untuk penuh picture see crawling.)

umum Jekyll SEO myths

“Jekyll handles SEO automatically.” (terjemahan) “Jekyll menangani SEO secara otomatis.” static output adalah crawler-friendly, tetapi metadata memerlukan jelas setup. Default themes sering ship dengan Tidak SEO tags di semua.

“GitHub Pages is fine for SEO — it’s free.” (terjemahan) “GitHub halaman adalah fine untuk SEO — ini adalah free.” GitHub halaman itself adalah fine — static output adalah crawler-friendly regardless dari host. catches adalah plugin whitelist (dan spesifik versi ini pins, tidak hanya yang plugins) dan, jika Anda brand bergantung pada URL, deciding pada sebuah custom domain sebelum Anda bangun sebuah audience pada github.io.

“Static sites don’t need sitemaps.” (terjemahan) “Static situs jangan perlu sitemaps.” Google dapat temukan halaman melalui tautan, tetapi sebuah sitemap speeds penemuan dan carries <lastmod> sinyal. jekyll-sitemap membuat ini trivial.

“Jekyll is dead.” (terjemahan) “Jekyll adalah dead.” ini adalah di mature maintenance mode — v4.4,1 shipped di January 2025. Minimal baru fitur, tetapi maintained dan secure, dan GitHub halaman akan mendukung ini indefinitely. untuk sederhana blogs dan docs, ini adalah sebuah solid, boring pilihan.

“I can use any plugin on GitHub Pages.” (terjemahan) “I dapat gunakan apa pun plugin pada GitHub halaman.” Tidak — --safe plus sebuah fixed whitelist. perbaiki adalah GitHub tindakan, tidak lebih gems.

Di mana ini fits

Jekyll adalah satu dari six generators di static situs generators cluster — GitHub halaman default dan satu sebagian besar developers memenuhi pertama. untuk lebih luas context pada bagaimana Google renders JavaScript dan ketika Anda sebenarnya perlu ini, see JavaScript SEO hub. bangun-freshness discipline itu applies untuk setiap SSG — sebuah static situs adalah hanya sebagai saat ini sebagai -nya terakhir bangun — applies untuk Jekyll too: edits jangan reach mesin pencari until Anda rebuild dan redeploy.

Tambahkan catatan pakar

Sematkan kutipan pakar

Orang baru? Buat profilnya yang belum diklaim di /admin/experts/ → Sematkan kutipan pakar terlebih dahulu.