Guide Jekyll SEO
«How to optimize Jekyll sites for search — why its static HTML is crawler-friendly by default, plus the jekyll-seo-tag and jekyll-sitemap plugins, permalinks, collections, robots.txt, and the GitHub Pages plugin whitelist.» _(Traduction)_ (Résumé en français du champ description : le texte source est conservé pour relecture francophone.)
1 indice probant sur cette page
- Données sources liéesdependency list
Jekyll outputs flat, static HTML — robots d’exploration obtenir complet contenu on le premier récupérer, avec aucun JavaScript rendu delay. Donc le SEO fonctionner n’est pas fighting le framework; c’est configuration. Install jekyll-seo-balise (titre, description, canonical, Ouvrir Graph, Twitter Card, JSON-LD) et jekyll-sitemap (sitemap.xml), et définir url: dans _config.yml or les deux produce broken sortie. Pick clean permalinks (/:titre/, pas date-based) pour evergreen contenu. Créer robots.txt yourself — Jekyll ne va pas. Watch deux GitHub Pages traps: le plugin whitelist (seulement a fixed définir exécute sans a GitHub Actions construire) et baseurl misconfiguration on project sites, qui breaks chaque URL canonique.
TL;DR — Jekyll construit votre entier site dans plain HTML fichiers ahead de temps, donc Google voit votre contenu on le premier visit — aucun waiting pour JavaScript. c’est a great starting point pour le SEO. Le fonctionner est dans le setup: install deux plugins (
jekyll-seo-tagpour meta balises,jekyll-sitemappour votre sitemap), définir votre site URL dans le config, pick clean URLs, et ajouter arobots.txtyourself.
Ce que Jekyll is
Jekyll est a static site generator — a outil que turns votre contenu (written dans
Markdown) et templates dans finished HTML fichiers avant anyone visits. c’est
written dans Ruby, et c’est le moteur behind GitHub Pages, donc si vous avez ever
pushed a project’s docs or a personal blog à a github.io adresse, vous avez
probably utilisé Jekyll sans thinking à propos de il. Preuve à l’appui de cette affirmation Jekyll transforms source content and templates into a static website and is supported by GitHub Pages. Portée : Jekyll and GitHub Pages. Niveau de confiance : élevé · Vérifié : Jekyll documentation GitHub Pages: Jekyll
Le important partie pour le SEO: parce que Jekyll produces plain HTML fichiers, a recherche moteur obtient votre complet contenu le moment il récupère lune page. il y a aucun JavaScript que a à exécuter premier. Que supprime un entier échec mode depuis le tableau — il ne fait pas guarantee indexation or rankings par itself, since que encore dépend on votre contenu, configuration, et le metadata covered ci-dessous.
Ce que Jekyll fait pas do pour vous
Ici’s le catch beginners hit: Jekyll est robot-friendly, mais il n’est pas “SEO-friendly” out de le box. A par défaut Jekyll theme souvent ships avec aucun titre balises, meta descriptions, or données structurées à tout. Vous ont à ajouter ceux. Le bon news est deux official plugins faire presque tout de il:
jekyll-seo-tag— ajoute votre titre balise, meta description, URL canonique, et social-sharing balises automatiquement.jekyll-sitemap— construit votresitemap.xmlautomatiquement. Preuve à l’appui de cette affirmation The jekyll-seo-tag and jekyll-sitemap plugins generate SEO tags and sitemap files for Jekyll sites. Portée : Named Jekyll plugins. Niveau de confiance : élevé · Vérifié : Jekyll SEO Tag Jekyll Sitemap
The five choses to obtenir correct
- Install
jekyll-seo-taget put{% seo %}dans votre layout’s<head>. - Install
jekyll-sitemapdonc moteur de recherches obtenir a liste de votre pages. - Définir
url:dans_config.ymlà votre réel domain — les deux plugins besoin il, or votre URL canoniques et sitemap point àlocalhostet break. - Utiliser a custom domain, pas le gratuit
username.github.io/repoadresse, pour quelconque site où classement matters. - Ajouter a
robots.txtyourself — Jekyll ne fait pas créer un.
The GitHub Pages surprise
Si vous host on GitHub Pages, vous ne peut pas simplement install quelconque plugin vous vouloir. GitHub
exécute Jekyll dans a locked-down mode que seulement permet a court liste de plugins.
Thankfully jekyll-seo-tag et jekyll-sitemap sont les deux on que liste — donc le
essentials fonctionner. Pour n’importe quoi fancier vous’d besoin a différent construire setup (covered
dans le Avancé tab).
Vouloir le complet version — le plugin whitelist, le baseurl bug que breaks
URL canoniques, permalinks, collections, et custom données structurées? Switch à le
Avancé tab.
TL;DR — Jekyll emits flat static HTML à construire temps, donc contenu est dans le raw réponse on le premier explorer — aucun Web Rendu Service, aucun Wave 2 delay. Le SEO fonctionner est configuration, pas architecture. Install
jekyll-seo-tag(titre, description, canonical, OG, Twitter Card, JSON-LD) etjekyll-sitemap(sitemap.xml); les deux exigerurl:dans_config.ymlor ils produce broken sortie. Utiliser clean permalinks (/:title/) over date-based ones pour evergreen contenu. Deux GitHub Pages traps dominate: le plugin whitelist (GitHub construit avec--safe; non-whitelisted plugins besoin a GitHub Actions construire) et a manquantbaseurlon project sites, qui breaks chaque generated URL canonique. GitHub Pages aussi pins spécifique plugin versions (3.10.0 core, olderjekyll-seo-tag/jekyll-sitemapreleases), pas simplement qui plugins exécuter. Collections besoinoutput: trueor ils sont jamais rendu. Drafts, future-dated posts, etpublished: falsedocuments sont excluded depuis a normal construire, et--incrementalest experimental — ne pas utiliser il pour production deploys. Etrobots.txtn’est pas auto-generated — faire il yourself.
Pourquoi Jekyll’s static output is bon pour le SEO
«Jekyll is a static site generator: it runs your Markdown and Liquid templates through a build step and emits finished HTML, once, before any request. That timing is the whole SEO advantage. Preuve à l’appui de cette affirmation Jekyll processes text and templates into static files during a build. Portée : Jekyll build architecture. Niveau de confiance : élevé · Vérifié : Jekyll documentation » (Traduction) (Résumé en français de la section dix-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Google’s pipeline is crawl → render → index, and rendering JavaScript is “a separate step” that sits in a queue — what people loosely call the “two-wave” process. Wave 1 fetches raw HTML and indexes text and links immediately; Wave 2 queues the page for the Web Rendering Service to run JavaScript, “a few seconds to weeks” later depending on crawl budget. With Jekyll, Wave 1 already contains all your content — there’s no JavaScript required to render the body. Wave 1 = Wave 2. No rendering delay, no rendering budget spent. This is the same argument that makes any static site generator the lowest-risk architecture for indexability. » (Traduction) (Résumé en français de la section vingt, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«The downstream benefits follow: » (Traduction) (Résumé en français de la section vingt et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Faster TTFB. Pre-built files served from a CDN (GitHub Pages sits behind Fastly; Netlify/Vercel have their own edges) mean no database queries and no server processing — good for LCP and the rest of Core Web Vitals. » (Traduction) (Résumé en français de la section vingt-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- No required JS payload for content → better FCP and LCP than a hydrating SPA. » (Traduction) (Résumé en français de la section vingt-deux, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- Proper HTTP status codes at the CDN layer, not client-side error handling. » (Traduction) (Résumé en français de la section vingt-deux, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«But none of that changes the fundamentals: static sites still need meta tags, sitemaps, canonical URLs, structured data, and good content. Jekyll’s output is crawler-friendly; the metadata is on you. » (Traduction) (Résumé en français de la section vingt-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
GitHub Pages et Jekyll SEO
Le la plupart courant Jekyll deployment est GitHub Pages — push à a branch avec Pages enabled et GitHub auto-construit le site. Que convenience comes avec SEO-pertinent constraints.
Project sites vs. utilisateur/org sites — l’URL decision
username.github.io/repo-name(a project site) lives on a shared subdomain avec thousands de autre unrelated sites. Il fonctionne fine pour docs, demos, et personal projects où l’URL itself ne fait pas besoin à carry votre brand.- A custom domain (point a
CNAMEà GitHub Pages) puts le site on une URL vous contrôler, avec HTTPS auto-provisioned par GitHub. Pour a site où le domain itself matters — a entreprise site, a blog vous êtes building an public autour — a custom domain depuis le commencer avoids a domain migration plus tard.
Si vous expect à déplacer à a custom domain eventually, définir il up early. Quelconque
domain migration signifie 301 redirections (jekyll-redirect-from handles ce) et a
period où inbound liens et quelconque accumulated signaux point à le old URL —
avoidable churn si vous pick le final domain up front plutôt que switching
plus tard. Ce est a migration-planning argument, pas a claim que a github.io
subdomain est penalized on son propre.
baseurl — le #1 canonical bug on project sites
«Project sites live under a subfolder (/repo-name/). If you don’t set
baseurl: /repo-name in _config.yml, every canonical URL jekyll-seo-tag
generates — and your internal links — will be wrong, missing the subfolder. This is
the single most common canonical-URL bug on Jekyll project sites. (User/org sites
served at the domain root don’t need baseurl.)
» (Traduction) (Résumé en français de la section trente, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«### The plugin whitelist » (Traduction) (Résumé en français de la section trente et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«GitHub Pages runs Jekyll with the --safe flag and only allows a fixed set of
plugins. Preuve à l’appui de cette affirmation GitHub Pages builds Jekyll in safe mode and supports a documented set of plugins. Portée : GitHub Pages hosted builds. Niveau de confiance : élevé · Vérifié : GitHub Pages: Jekyll plugins The SEO-relevant whitelisted ones:
» (Traduction) (Résumé en français de la section trente-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- jekyll-seo-tag ✓
» (Traduction) (Résumé en français de la section trente-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- jekyll-sitemap ✓
» (Traduction) (Résumé en français de la section trente-trois, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- jekyll-redirect-from ✓ (for 301s when you change URLs)
» (Traduction) (Résumé en français de la section trente-trois, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- jekyll-paginate ✓
» (Traduction) (Résumé en français de la section trente-trois, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
Pas whitelisted (et silently ne va pas exécuter, or va erreur):
jekyll-last-modified-at— nécessaire pour accurate sitemap<lastmod>from fichier timestamps- Custom structured-data plugins
- Anything dropped in a
_plugins/folder
«### It’s not just which plugins — it’s which versions » (Traduction) (Résumé en français de la section trente-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«GitHub Pages doesn’t only restrict which plugins run; it pins the exact version
of each one, and that build environment itself is pinned to an older Jekyll.
As of the dependency list’s last
update, the hosted build runs Jekyll 3.10.0 with jekyll-seo-tag 2.8.0,
jekyll-sitemap 1.4.0, and jekyll-feed 0.17.0 — while jekyllrb.com’s own
docs describe the current upstream release, 4.4.1. A behavior documented in a
plugin’s latest README isn’t guaranteed to exist in the version GitHub Pages
actually runs; check pages.github.com/versions.json for the pinned version
before relying on a specific flag or output. A GitHub Actions build sidesteps
this too — you control the Gemfile, so you get the versions you pin, not
GitHub’s.
» (Traduction) (Résumé en français de la section trente-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«### The GitHub Actions workaround » (Traduction) (Résumé en français de la section trente-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«The fix for the whitelist isn’t “add more gems” — it’s to stop letting GitHub do
the build. Run Jekyll yourself in CI (actions/jekyll-build-pages, or build
locally and push _site/ to the deploy branch with peaceiris/actions-gh-pages)
and the whitelist no longer applies. Now any plugin runs, and you pick the
Jekyll and plugin versions instead of inheriting GitHub’s pinned set.
» (Traduction) (Résumé en français de la section trente-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
The jekyll-seo-tag plugin
Ce est le official, maintained plugin que covers la plupart de le core metadata
Jekyll ne fait pas ajouter on son propre. Exactly ce que il emits dépend on qui version
vous ont installed, votre _config.yml et front matter, et si votre
layout en réalité calls {% seo %} — GitHub Pages, pour instance, pins a spécifique
version plutôt que toujours shipping le latest release (plus on que ci-dessous).
Vérifier le avancé usage guide
pour votre version’s exact sortie, et confirmer ce que en réalité landed par grepping
votre propre construit HTML plutôt que assuming c’est complet.
Install:
# Gemfile
gem 'jekyll-seo-tag'# _config.yml
plugins:
- jekyll-seo-tag<!-- _layouts/default.html, before </head> -->
{% seo %}Ce que it generates automatically:
<title>— page titre avec site nom appended (Page Title | Site Name)<meta name="description">— depuisdescription:front matter or le site description<link rel="canonical">— construit depuissite.url+page.url- Ouvrir Graph balises (
og:title,og:description,og:url,og:site_name,og:image) - Twitter Card balises (
twitter:card,twitter:title,twitter:description,twitter:creator,twitter:image) - JSON-LD données structurées (
BlogPostingpour posts,WebSitepour le page d’accueil) - Pagination meta (suivant/prev URLs)
Requis _config.yml paramètres — sans ces le plugin produces broken
sortie:
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_imagePer-page front matter 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 (quand votre layout déjà outputs its propre):
{% seo title=false %} <!-- suppress the <title> -->
{% seo canonical=false %} <!-- suppress the canonical link -->Un gotcha worth flagging: nombreux minimal themes (notamment minima) ship sans
jekyll-seo-tag wired in. Ajout the gem to votre Gemfile ne fait pashing unless the
theme’s layout en réalité calls {% seo %}.
Sitemaps with jekyll-sitemap
«Same install pattern (Gemfile + _config.yml). It generates a sitemaps.org-
compliant sitemap.xml at /sitemap.xml on every build.
» (Traduction) (Résumé en français de la section cinquante-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«It requires url: in _config.yml — without it, sitemap entries have no
domain.
» (Traduction) (Résumé en français de la section cinquante-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Controlling <lastmod>, in priority order:
» (Traduction) (Résumé en français de la section cinquante-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«1. last_modified_at: in front matter (best — explicit control)
2. Post creation date (fallback — often wrong for evergreen content updated later)
3. Filesystem modification date (needs the non-whitelisted jekyll-last-modified-at)
» (Traduction) (Résumé en français de la section cinquante-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Best practice: add last_modified_at: YYYY-MM-DD to every post, and bump it
when you update content — that’s the freshness signal recrawl prioritization leans
on.
» (Traduction) (Résumé en français de la section soixante, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Excluding pages: » (Traduction) (Résumé en français de la section soixante et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
# Per-page front matter
sitemap: false
# Global pattern (in _config.yml)
defaults:
- scope:
path: "assets/**/*.pdf"
values:
sitemap: false«## Permalink configuration » (Traduction) (Résumé en français de la section soixante-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Permalinks are set globally in _config.yml or overridden per page in front matter.
» (Traduction) (Résumé en français de la section soixante-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«| Style | Pattern | SEO notes |
|-------|---------|-----------|
| date (default) | /:categories/:year/:month/:day/:title.html | Date-heavy, fragile if the post date changes |
| pretty | /:categories/:year/:month/:day/:title/ | Trailing slash, no .html |
| none | /:categories/:title.html | No date burial |
| Custom | /:title/ or /:categories/:title/ | Most control — recommended for evergreen content |
» (Traduction) (Résumé en français de la section soixante-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Recommended for most sites: » (Traduction) (Résumé en français de la section soixante-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
permalink: /:title/
# or
permalink: /:categories/:title/«Why avoid date-based URLs for evergreen posts: » (Traduction) (Résumé en français de la section soixante-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Changing a post’s date: front matter changes its URL → inbound links break.
» (Traduction) (Résumé en français de la section soixante-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Deep hierarchy (/2019/03/14/post-title/) buries content for no reason.
» (Traduction) (Résumé en français de la section soixante-neuf, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- (For news and journalism, date URLs are fine and expected — this is a per-context
call, not a universal rule.)
» (Traduction) (Résumé en français de la section soixante-neuf, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«Collections need their own permalink config: » (Traduction) (Résumé en français de la section soixante-dix, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
collections:
case_studies:
output: true
permalink: /case-studies/:name/«A warning on changing patterns: once URLs are indexed, switching permalink
styles requires 301 redirects (use jekyll-redirect-from). Skip the redirects and
you break link equity and generate 404s in Search Console.
» (Traduction) (Résumé en français de la section soixante-douze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Collections and SEO » (Traduction) (Résumé en français de la section soixante-treize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Collections are Jekyll’s custom content types beyond posts and pages — docs sections, portfolio items, team members, case studies, FAQs. Two requirements make or break their SEO: » (Traduction) (Résumé en français de la section soixante-quatorze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
-
output: truedoit être définir. Sans il, collection documents sont jamais rendu as individual HTML fichiers et therefore ne peut pas être indexé. Ce est a silent indexation killer — le contenu exists dans votre repo mais jamais becomes a crawlable page.collections: docs: output: true # REQUIRED for indexable pages permalink: /docs/:name/ -
Chaque document nécessite front matter — même an vide
---block. Sans it, Jekyll treats the fichier as a binary static fichier: aucun Liquid processing, aucun metadata, aucunjekyll-seo-tagintegration.
Remarque que collections ne sont pas inclus dans RSS feeds (seulement posts sont). Pour grand documentation sites, collections sont généralement le correct structure anyway.
Publishing states et incremental construit
Jekyll has several independent switches que contrôler ce que en réalité ends up in the construit site. Mixing les up produces soit pages que silently jamais obtenir construit, or draft/future content que ships to production by accident:
- Drafts (
_drafts/) sont excluded depuis a normal construire entirely. Ils seulement apparaître quand vous exécuterbundle exec jekyll serve --drafts(orbuild --drafts) locally — moving a post dans_posts/avec a réel date est ce que en réalité publishes il. - Future-dated posts (a
date:plus tard que le actuel temps) sont excluded par par défaut.future: truedans_config.yml, or le--futureflag, inclut les — handy pour local preview, mais leaving il on dans a production config signifie scheduled posts go actif le moment vous construire, pas on leur prévu date. published: falsedans front matter excludes a document depuis le construire regardless de son date — a séparé switch depuis drafts et future posts, et facile à laisser définir après testing une page vous meant à ship.- Incremental regeneration (
--incremental) est documented par Jekyll as experimental, et il tracks a limited dependency graph — mainly inclut et layouts. Une page que iteratessite.postsor autre collection données (a balise indexer, an archive, related-posts logic) peut go stale sous--incrementalsans Jekyll detecting que le underlying posts modifié. ne pas exécuter il as partie de a production deploy; utiliser a completbundle exec jekyll buildpour n’importe quoi vous êtes pushing actif.
Avant trusting quelconque de ces, construire sans le flags vous utiliser locally
(--drafts, --future, --incremental) et confirmer le sortie dans _site/
matches ce que vous intend à publish — le safest par défaut pour a deploy pipeline
est a clean, complet, non-incremental construire.
Custom head partials avec Liquid
Quand jekyll-seo-tag isn’t suffisant, vous construire votre propre _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>Clé Liquid filters pour le SEO:
| strip_html— supprime balises depuis an auto-excerpt (essential pour clean descriptions)| strip_newlines— supprime line breaks depuis excerpts| truncate: 160— an optional template-side character cap, pas a Google limite. Préférer an authored, page-spécifique description et preview le rendu extrait; fit varies par requête, device, langue, et script.| prepend: site.url— construit absolute URLs pour canonical et OG balises| date_to_xmlschema— ISO 8601 dates pour JSON-LDdatePublished/dateModified| default: fallback— fallback quand a variable est nil
Custom JSON-LD au-delà ce que 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 n’est pas auto-generated
Jekyll fait pas créer robots.txt. Vous faire it yourself in le site root.
Inclure an vide front-matter block so Liquid processes the fichier (so {{ site.url }}
resolves):
---
---
User-agent: *
Allow: /
Sitemap: {{ site.url }}/sitemap.xmlSans ce, il y a aucun sitemap référence dans robots.txt — et some robots d’exploration utiliser
que as a discovery mechanism. (robots.txt contrôle exploration, pas indexation —
pour le complet picture voir exploration.)
Courant Jekyll SEO myths
“Jekyll handles SEO automatiquement.” Le static sortie est robot-friendly, mais metadata exige explicit setup. Par défaut themes souvent ship avec aucun SEO balises à tout.
“GitHub Pages est fine pour SEO — c’est gratuit.” GitHub Pages itself est fine — le
static sortie est robot-friendly regardless de host. Le catches sont le plugin
whitelist (et le spécifique versions il pins, pas simplement qui plugins) et,
si votre brand dépend on l’URL, deciding on a custom domain avant vous construire
an public on github.io.
“Static sites don’t need sitemaps.” Google peut trouver pages via liens, mais a
sitemap speeds discovery et carries <lastmod> signaux. jekyll-sitemap rend il
trivial.
“Jekyll is dead.” c’est dans mature maintenance mode — v4.4,1 shipped dans January 2025. Minimal nouveau fonctionnalités, mais maintained et secure, et GitHub Pages va prise en charge il indefinitely. Pour simple blogs et docs, c’est a solid, boring choice.
“I can use any plugin on GitHub Pages.” Aucun — --safe plus a fixed whitelist.
The fix is GitHub Actions, pas plus gems.
Où ce fits
Jekyll est un de le six generators dans le static site generators cluster — le GitHub Pages par défaut et le un la plupart developers meet premier. Pour le broader context on comment Google renders JavaScript et quand vous en réalité besoin il, voir le JavaScript SEO hub. Le construire-freshness discipline que s’applique à chaque SSG — a static site est seulement as actuel as son dernier construire — s’applique à Jekyll aussi: edits ne pas reach moteur de recherches jusqu’à vous rebuild et redeploy.
AI summary
A condensed prendre on the Avancé version:
- Jekyll est a Ruby static site generator et le moteur behind GitHub Pages. Il emits flat HTML à construire temps, donc contenu est dans le raw réponse on le premier explorer — aucun JavaScript rendu étape, aucun Wave 2 delay. c’est le core SEO advantage, shared par tout static site generators.
- Le SEO fonctionner est configuration, pas architecture. Par défaut themes souvent ont aucun SEO metadata à tout.
jekyll-seo-tag(official plugin) auto-generates titre, description, canonical, Ouvrir Graph, Twitter Card, et JSON-LD (BlogPosting/WebSite). Ajouter{% seo %}à votre layout’s<head>. Overridable par page dans front matter.jekyll-sitemapauto-generatessitemap.xml. Les deux plugins exigerurl:dans_config.ymlor sortie est broken (canonical/sitemap point à localhost).- Permalinks: préférer
/:title/or/:categories/:title/over date-based URLs pour evergreen contenu (date URLs break si le post date changements). - Collections besoin
output: true(or ils sont jamais rendu as pages) et front matter on chaque document (or aucun metadata processing). - Publishing states: drafts (
_drafts/), future-dated posts, etpublished: falsedocuments sont tout excluded depuis a normal construire unless vous explicitly opt dans (--drafts,--future).--incrementalest experimental et peut miss pages que depend onsite.posts— ne pas utiliser il pour a production deploy. robots.txtn’est pas auto-generated — créer il manuellement (avec vide front matter donc Liquid resolves{{ site.url }}dans leSitemap:line).- Deux GitHub Pages traps: le plugin whitelist (
--safeconstruire; seulementjekyll-seo-tag,jekyll-sitemap,jekyll-redirect-from,jekyll-paginateparmi SEO plugins — others besoin a GitHub Actions construire), et manquantbaseurlon project sites, qui breaks chaque URL canonique. GitHub Pages aussi pins spécifique plugin versions (e.g. Jekyll 3.10.0 core), qui peut trail le latest upstream release. - Si a custom domain matters à votre brand, définir il up early plutôt que on
username.github.io/repo— moving domains plus tard signifie 301s et a period où inbound liens point à le old URL. GitHub Pages aussi pins spécifique plugin versions (pas simplement qui plugins), qui peut trail le latest upstream release. - Construire freshness s’applique as à quelconque SSG: changements seulement reach recherche après a rebuild + redeploy.
«## Official documentation » (Traduction) (Résumé en français de la section cent neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Primary-source documentation — from Jekyll, its plugins, GitHub Pages, and the search engines. » (Traduction) (Résumé en français de la section cent dix, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Jekyll
» (Traduction) (Résumé en français de la section cent onze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Jekyll docs — the documentation hub.
» (Traduction) (Résumé en français de la section cent onze, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Permalinks — the built-in styles and custom patterns.
» (Traduction) (Résumé en français de la section cent onze, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Front Matter — the YAML block that drives per-page metadata.
» (Traduction) (Résumé en français de la section cent onze, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Collections — custom content types and the output: true requirement.
» (Traduction) (Résumé en français de la section cent onze, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Plugins — how Jekyll’s plugin system works.
» (Traduction) (Résumé en français de la section cent onze, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Variables — the site/page variables and Liquid filters used in head partials.
» (Traduction) (Résumé en français de la section cent onze, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«Official plugins
» (Traduction) (Résumé en français de la section cent douze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- jekyll-seo-tag — the metadata plugin, plus its advanced usage guide.
» (Traduction) (Résumé en français de la section cent douze, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- jekyll-sitemap — automatic sitemap.xml.
» (Traduction) (Résumé en français de la section cent douze, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- jekyll-redirect-from — 301 redirects when you change URLs.
» (Traduction) (Résumé en français de la section cent douze, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«GitHub Pages » (Traduction) (Résumé en français de la section cent treize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- About GitHub Pages and Jekyll — how the auto-build works. » (Traduction) (Résumé en français de la section cent treize, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- About custom domains and GitHub Pages — the custom-domain setup. » (Traduction) (Résumé en français de la section cent treize, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.) «- pages.github.com/versions.json — the live plugin whitelist and locked dependency versions. » (Traduction) (Résumé en français de la section cent treize, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.) «- Jekyll releases and endoflife.date/jekyll — version and maintenance status. » (Traduction) (Résumé en français de la section cent treize, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«Search engines » (Traduction) (Résumé en français de la section cent quatorze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- JavaScript SEO basics — the crawl → render → index phases (two-wave rendering) that a static build lets you skip for content. » (Traduction) (Résumé en français de la section cent quatorze, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- In-Depth Guide to How Google Search Works — where rendering sits in the pipeline. » (Traduction) (Résumé en français de la section cent quatorze, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.) «- Core Web Vitals (web.dev) — the performance metrics a fast static site benefits from structurally. » (Traduction) (Résumé en français de la section cent quatorze, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Quotes from the source » (Traduction) (Résumé en français de la section cent dix-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Là sont aucun on-record citations depuis Google or Bing reps précisément à propos de Jekyll. Google ne fait pas comment on individual static site generators. Le SEO cas pour Jekyll rests on Google’s general rendu et static-HTML guidance, qui s’applique à quelconque static site.
Google — rendu est a séparé, queued étape (le chose Jekyll’s static sortie supprime depuis le critical chemin)
«- “During the crawl, Google renders the page and runs any JavaScript it finds using a recent version of Chrome.” — Google Search Central docs. With Jekyll, there’s no JavaScript needed to render the body, so this step costs you nothing. Jump to quote » (Traduction) (Résumé en français de la section cent vingt, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Rendering is important because websites often rely on JavaScript to bring content to the page, and without rendering Google might not see that content.” — i.e., if your content is already in the static HTML (as it is with Jekyll), rendering can’t cost you visibility. Jump to quote » (Traduction) (Résumé en français de la section cent vingt, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
Remarque: Je haven’t trouvé quelconque verbatim statement depuis Google or Bing reps (Mueller, Illyes, Splitt, Canel) naming Jekyll or GitHub Pages précisément. Claims à propos de Jekyll SEO devrait cite Google’s general static-site et rendu guidance — qui est ce que le citations ci-dessus sont — plutôt que a Jekyll-spécifique rep citation.Jekyll SEO checklist
A scannable réussir to confirmer votre Jekyll site is définir up to rank:
-
url:est définir dans_config.ymlà votre réel production domain (paslocalhost:4000). - Pour a GitHub Pages project site,
baseurl: /repo-nameest définir (skip on utilisateur/org root sites). -
jekyll-seo-tagest installed et le theme layout en réalité calls{% seo %}dans le<head>. -
jekyll-sitemapest installed et/sitemap.xmlest generating. - Sitemap est submitted dans la recherche Google Console et Bing Webmaster Outils.
-
title:,description:, etauthor:sont définir dans_config.yml. - Chaque post/page a an explicit
description:(ne pas rely on auto-excerpt). -
last_modified_at:est on posts et bumped quand contenu changements. - Permalinks utiliser
/:title/or/:categories/:title/pour evergreen contenu (pas le date par défaut). - A
robots.txtexists (avec vide front matter) et références le sitemap. - Chaque collection que devrait être indexé a
output: true. - Chaque collection document a front matter (même an vide
---). - A custom domain est configuré (HTTPS auto-provisioned), pas le bare
github.iosubdomain. - URL/permalink changements sont paired avec
jekyll-redirect-from301s. - Images sont compressed avant commit (Jekyll ne fait pas optimize les à construire).
- Un trailing-slash convention est enforced via le permalink style (aucun
/page/vs/pageduplicates). - Production construit exécuter sans
--draftsor--future, et aucun page vous intend à ship encore apublished: false. - Production deploys utiliser a complet
bundle exec jekyll build, pas--incremental(experimental, et peut misssite.posts-dependent pages).
«## Jekyll SEO — cheat sheet » (Traduction) (Résumé en français de la section cent vingt-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«The two essential plugins » (Traduction) (Résumé en français de la section cent trente, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«| Plugin | Does | Whitelisted on GitHub Pages? | Needs |
| --- | --- | --- | --- |
| jekyll-seo-tag | Title, description, canonical, OG, Twitter Card, JSON-LD | Yes ✓ | url:, {% seo %} in <head> |
| jekyll-sitemap | Auto sitemap.xml | Yes ✓ | url: |
| jekyll-redirect-from | 301 redirects | Yes ✓ | redirect_from: in front matter |
| jekyll-last-modified-at | Filesystem <lastmod> | No ✗ | GitHub Actions build |
» (Traduction) (Résumé en français de la section cent trente et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Required _config.yml keys (or output breaks)
» (Traduction) (Résumé en français de la section cent trente-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
| Clé | Pourquoi |
|---|---|
url: | URL canoniques + sitemap entries; sans it → localhost |
baseurl: | Project sites sous /repo/ — sans it → broken canonicals |
title: / description: | Defaults pour jekyll-seo-tag |
author: | Author info in JSON-LD |
«Permalink styles » (Traduction) (Résumé en français de la section cent trente-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«| permalink: value | Output | Use for |
| --- | --- | --- |
| date (default) | /cat/2019/03/14/title.html | Avoid for evergreen |
| pretty | /cat/2019/03/14/title/ | Date-relevant content |
| none | /cat/title.html | No date burial |
| /:title/ | /title/ | Most evergreen sites |
» (Traduction) (Résumé en français de la section cent trente-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Fast facts
» (Traduction) (Résumé en français de la section cent trente-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Jekyll output is static HTML → no Wave 2 rendering delay; content in the first
fetch.
» (Traduction) (Résumé en français de la section cent trente-six, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- robots.txt is NOT auto-generated — create it (with empty front matter).
» (Traduction) (Résumé en français de la section cent trente-six, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Collections need output: true and front matter, or they don’t index.
» (Traduction) (Résumé en français de la section cent trente-six, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- GitHub Pages builds with --safe + a plugin whitelist — non-whitelisted plugins
need a GitHub Actions build.
» (Traduction) (Résumé en français de la section cent trente-six, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Current upstream Jekyll: v4.4.1 (Jan 2025); GitHub Pages runs a locked
v3.10.0 with its own pinned plugin versions (jekyll-seo-tag 2.8.0,
jekyll-sitemap 1.4.0, jekyll-feed 0.17.0) — check
pages.github.com/versions.json for
the current list.
» (Traduction) (Résumé en français de la section cent trente-six, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- If a custom domain matters to your brand, set it up before building an
audience on username.github.io/repo — avoids a later domain migration.
» (Traduction) (Résumé en français de la section cent trente-six, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Build and check your Jekyll site locally » (Traduction) (Résumé en français de la section cent trente-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Before trusting production, build locally and verify your metadata is actually in the HTML. » (Traduction) (Résumé en français de la section cent quarante, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«macOS / Linux » (Traduction) (Résumé en français de la section cent quarante et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
# Install dependencies and serve locally (defaults to http://localhost:4000)
bundle install
bundle exec jekyll serve
# Build the production site into _site/ (override the dev url)
JEKYLL_ENV=production bundle exec jekyll build
# Confirm jekyll-seo-tag actually emitted a canonical + title into a built page
grep -i 'rel="canonical"' _site/index.html
grep -i "<title>" _site/index.html
# Confirm the sitemap was generated and points at your real domain (not localhost)
grep -i "<loc>" _site/sitemap.xml | head«Windows (PowerShell) » (Traduction) (Résumé en français de la section cent quarante-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
# Install dependencies and serve locally
bundle install
bundle exec jekyll serve
# Build the production site (set the env var for this command)
$env:JEKYLL_ENV="production"; bundle exec jekyll build
# Confirm canonical + title made it into the built HTML
Select-String -Path _site\index.html -Pattern 'rel="canonical"'
Select-String -Path _site\index.html -Pattern "<title>"
# Confirm the sitemap was generated with your real domain
Select-String -Path _site\sitemap.xml -Pattern "<loc>" | Select-Object -First 10Si <loc> entries or the canonical montrer localhost:4000, votre url: isn’t définir (or
JEKYLL_ENV=production wasn’t applied) — fix _config.yml avant deploying.
A starter robots.txt pour Jekyll
Enregistrer ce as robots.txt dans votre site root. Le vide front-matter bloquer est ce que
rend Liquid traiter le fichier donc {{ site.url }} resolves:
---
---
User-agent: *
Allow: /
Sitemap: {{ site.url }}/sitemap.xml Outils pour Jekyll SEO
jekyll-seo-tag— le official metadata plugin (titre, description, canonical, OG, Twitter Card, JSON-LD). Le unique biggest SEO win pour a Jekyll site.jekyll-sitemap— official automaticsitemap.xml.jekyll-redirect-from— generate 301 redirections dans front matter quand vous modifier permalinks.- GitHub Actions (
actions/jekyll-build-pages,peaceiris/actions-gh-pages) — construire Jekyll yourself à escape le GitHub Pages plugin whitelist et exécuter quelconque plugin. - Recherche Google Console — vérifier le site, submit le sitemap, et watch indexation/coverage. Essential pour a nouveau Jekyll site.
- Bing Webmaster Outils — submit le sitemap (vous pouvez import credentials depuis GSC).
- View Source / Inspection d’URL — confirmer votre titre, meta description, et canonical sont dans le raw HTML (ils devrait être, since Jekyll est static).
- PageSpeed Insights / web.dev — vérifier Core Web Vitals; a static Jekyll site devrait score bien, mais unoptimized images sont le courant drag.
Jekyll SEO mistakes to éviter
Concrete mistakes personnes en réalité faire setting up Jekyll pour search — prevention, pas diagnosis.
Leaving url: unset in _config.yml
Les deux jekyll-seo-tag et jekyll-sitemap construire absolute URLs depuis site.url.
Skip il et votre balise canonicals et sitemap <loc> entries soit point à
localhost:4000 (le dev par défaut) or come out avec aucun domain à tout — c’est
URL canoniques et a sitemap que actively mislead robots d’exploration au lieu de helping
les. Faire ce à la place: définir url: à votre réel production domain dans
_config.yml avant le premier deploy, et grep le construit _site/ sortie pour
localhost à confirmer il n’a pas leak via.
«### Skipping baseurl on a GitHub Pages project site
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
username.github.io/repo-name sites actif sous a /repo-name/ subfolder. Si
baseurl: /repo-name n’est pas définir, chaque URL canonique jekyll-seo-tag generates —
et votre lien internes — est manquant que subfolder, pointing à une URL que
ne fait pas exist. Ce est le unique la plupart courant canonical-URL bug on Jekyll project
sites. Faire ce à la place: définir baseurl: on project sites (utilisateur/org sites à
le domain root ne pas besoin il), et spot-vérifier a construit page’s canonical contre
son réel, actif URL.
Assuming a collection is indexable sans output: true
Collections (docs sections, cas studies, team bios) sont Jekyll’s custom contenu
type, mais sans output: true dans _config.yml, le documents sont jamais
rendu as individual HTML fichiers — le contenu sits dans votre repo et simplement
jamais becomes a crawlable page. il y a aucun erreur, aucun warning, simplement pages que
jamais exist. Faire ce à la place: définir output: true on chaque collection meant
à être public, et après a construire, confirmer le attendu HTML fichiers en réalité landed
dans _site/.
En utilisant date-based permalinks pour evergreen content
Le Jekyll par défaut permalink style (/:categories/:year/:month/:day/:title.html)
bakes le publish date dans l’URL. Modifier le post’s date: front matter plus tard
— qui personnes faire, souvent simplement à bump il pour a re-publish — et l’URL changements
avec il, breaking chaque inbound lien et forcing a redirection cleanup vous n’a pas
plan pour. Faire ce à la place: utiliser /:title/ or /:categories/:title/ pour
evergreen posts; reserve date-based permalinks pour genuinely date-pertinent
contenu comme news, où le date belongs dans l’URL.
Trying à install a non-whitelisted plugin on GitHub Pages et expecting il à exécuter
GitHub construit Jekyll avec le --safe flag, qui silently skips or erreurs on
quelconque plugin à l’extérieur a fixed whitelist — dropping a gem comme
jekyll-last-modified-at or a custom structured-données plugin dans _plugins/
et pushing il ne fait pas faire il exécuter on le par défaut GitHub Pages construire. Faire ce
à la place: vérifier le plugin contre
pages.github.com/versions.json premier;
si c’est pas listed, construire avec GitHub Actions (actions/jekyll-build-pages or a
local construire pushed via peaceiris/actions-gh-pages) au lieu de fighting le
whitelist.
Assuming Jekyll ships a robots.txt
Jekyll ne fait pas generate robots.txt — il y a aucun plugin toggle, aucun par défaut
fichier, rien. A site avec aucun robots.txt à tout n’est pas broken pour indexation, mais
il aussi a aucun Sitemap: référence pour robots d’exploration que utiliser robots.txt as a
discovery mechanism. Faire ce à la place: créer robots.txt yourself dans le
site root avec an vide front-matter bloquer (--- ---) donc Liquid processes il
et {{ site.url }} resolves dans le Sitemap: line.
Testez vos connaissances: Jekyll SEO
Five rapide questions on optimizing Jekyll sites pour search. Pick an réponse pour chaque, alors vérifier.
Ressources utiles
Mon writing
- JavaScript SEO: A Definitive Guide — rendu, DOM parity, et pourquoi static/prerendered sortie (comme Jekyll’s) est le faible-risque fin de le spectrum.
- Le Beginner’s Guide à SEO technique — où rendu architecture et sitemaps fit dans le bigger picture.
Mon speaking
- Comment Recherche Fonctionne (SlideShare) — mon walkthrough de exploration, rendu, indexation, et classement. (Mon standing disclaimer s’applique: “This is my understanding of systems… not going to be 100% complete or accurate.”)
Depuis autour le industry
- Jekyll docs — le Documentation officielle, notamment permalinks et collections.
- jekyll-seo-balise — le official metadata plugin et son avancé usage guide.
- jekyll-sitemap — le official sitemap plugin.
- À propos de GitHub Pages et Jekyll — GitHub’s propre docs on le construire traiter et constraints.
- pages.github.com/versions.json — le authoritative GitHub Pages plugin whitelist et locked versions.
- Recherche Google Central — JavaScript SEO basics — le rendu phases a static construire lets vous skip.
- CloudCannon — jekyll-seo-balise showcase — a practitioner walkthrough de le plugin.
Journal des modifications
Mis à jour le 27 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.
Mis à jour le 18 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.