Guide Hexo SEO

Comment faire SEO on a Hexo site — le Node.js static site generator. Hexo outputs pure HTML donc contenu est crawlable on le premier récupérer, mais sitemaps, robots.txt, meta descriptions, canonicals, données structurées, et stable permalinks tout depend on plugins et config.

Première publication : 26 juin 2026 · Dernière mise à jour : 3 août 2026 · Avancé

Hexo est a Node.js static site generator: hexo generate compiles Markdown dans pure static HTML, donc Googlebot lit votre complet contenu on le premier récupérer avec aucun JavaScript rendu queue. c’est le crawlability floor — mais c’est pas finished SEO. La plupart par défaut themes ship aucun sitemap, aucun robots.txt, aucun per-post meta description, aucun canonical, et aucun données structurées; vous ajouter ceux avec _config.yml paramètres, front matter champs, theme edits, et plugins (hexo-generator-sitemap, hexo-generator-robotstxt, hexo-generator-feed, hexo-abbrlink). Le big traps sont a incorrect url: dans _config.yml, le date-based par défaut permalink que breaks liens on rename, et auto-generated category/balise archives que créer thin contenu dupliqué. Pour Baidu-facing sites, le static sortie supprime a réel exploration obstacle — though c’est pas a guarantee de Baidu indexation or classement.

TL;DR — Hexo (hexo generate) emits pure static HTML, donc votre contenu est dans le premier byte de la réponse — aucun Web Rendu Service, aucun Wave 2 delay. c’est le crawlability floor, pas finished SEO. Par défaut themes ship aucun sitemap, aucun robots.txt, aucun per-post meta description, aucun canonical, et aucun données structurées; vous ajouter les via _config.yml, front matter, theme template edits, et plugins (hexo-generator-sitemap, hexo-generator-robotstxt, hexo-generator-feed, hexo-abbrlink, hexo-indexnow). Le three traps que en réalité bite: a incorrect url: dans _config.yml breaks canonicals/sitemap/feed; le date-based par défaut permalink ties URLs à filenames donc a rename breaks liens; et auto-generated category/balise archives créer thin contenu dupliqué. Pour Baidu-facing sites le static sortie est a réel advantage.

Hexo’s static output is the exploration advantage

hexo generate exécute votre Markdown et theme templates via a construire étape et écrit a folder de finished HTML, CSS, et assets. Le SEO-pertinent fact est quand le HTML exists: à construire temps, une fois, pour everyone — pas per requête, et pas dans le navigateur. Preuve à l’appui de cette affirmation The Hexo generate command builds static files into the configured public directory. Portée : Hexo generate command. Niveau de confiance : élevé · Vérifié : Hexo: Commands

Google décrit a deux-phase traiter pour JavaScript pages: Wave 1 récupère le raw HTML et indexes static contenu immédiatement; Wave 2 est a deferred headless-Chromium rendu queue que peut prendre seconds à days. Hexo sortie skips Wave 2 entirely — chaque page est raw HTML on le premier récupérer. Google’s propre guidance est blunt que ce est le recommended chemin: dynamic rendu était “a workaround et pas a à long terme solution… utiliser rendu côté serveur, static rendu, or hydration as a solution,” et Hexo produces static rendu, un de le three explicitly recommended approaches.

Two plus wins fall out of ce:

«- Crawlable links by default. Hexo templates emit plain <a href> anchors in static HTML, so they satisfy Google’s requirement that links be real, crawlable URLs — no JavaScript-generated navigation to design around. » (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.) «- Cheap to crawl. Static files served from a CDN have effectively zero server-processing cost per request, so Googlebot can crawl at its allowed rate without tripping crawl-rate throttling. As Gary Illyes put it, “if you are making expensive database calls, that’s going to cost the server a lot” — Hexo makes none. » (Traduction) (Résumé en français de la section vingt-trois, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)

Le caveat: zero rendre-blocking pour robots d’exploration n’est pas le même as zero rendre-blocking pour utilisateurs. Theme JS/CSS encore affecte Core Web Vitals (plus ci-dessous).

Configurer _config.yml premier — url: is the big un

Définir ces global keys avant votre premier deploy:

url: https://yourdomain.com       # must match your live domain, with https://
permalink: :title/                # or :year/:month/:day/:title/ (the default)
title: Site Title
description: Global meta description fallback
author: Your Name
language: en
meta_generator: false             # removes the <meta name="generator" content="Hexo"> tag
  • url: est le unique la plupart consequential paramètre. c’est le site’s configuré base URL, qui themes et generators peut utiliser pour balise canonicals, feeds, sitemaps, et pagination. A incorrect valeur peut propagate dans ceux outputs. Preuve à l’appui de cette affirmation Hexo's url configuration supplies the website URL used by themes and generators. Portée : Exact downstream fields depend on the installed theme and plugins. Niveau de confiance : élevé · Vérifié : Hexo: Configuration
  • permalink: — le par défaut :year/:month/:day/:title/ produces date-based URLs que regarder stale over temps et tie le slug à le filename. Cleaner options sont /:title/ or /:category/:title/.
  • meta_generator: false strips Hexo’s generator fingerprint depuis <head>.
  • Deploying à a subdirectory? url: alone n’est pas suffisant — définir root: à le subdirectory chemin aussi (e.g. root: /blog/). Hexo’s url_for helper construit root-relative liens, pendant que full_url_for prepends le complet url: valeur; obtenir root: incorrect on a subdirectory deploy et lien internes, feeds, et sitemap entries fin up pointing à le domain root au lieu de le réel chemin.
  • Config precedence: le site’s _config.yml sets le base url/root/permalink valeurs; a theme’s propre config (son bundled _config.yml, or a _config.<theme>.yml à le project root) layers on top pour afficher et template paramètres, mais ne fait pas override le site-level Structure d’URL — a theme ne peut pas corriger a incorrect url:.
  • Testing dans sûr mode? hexo server --safe (or hexo --safe) disables chaque plugin et script, donc le sortie vous êtes viewing est manquant votre sitemap, robots.txt, et quelconque SEO plugin’s balises. ne pas utiliser a sûr-mode preview à vérifier SEO sortie — exécuter a normal hexo generate premier.

Front matter SEO contrôle (and what’s manquant)

Native Hexo front matter vous pouvez rely on:

---
title: "Article Title for the <title> tag"
date: 2024-01-15
updated: 2024-06-01
tags: [tag1, tag2]
categories: [Category]
permalink: /custom-url/           # overrides the global pattern for this post
published: true
sitemap: false                    # exclude this post from sitemap.xml
---

Ce que is pas in native front matter and nécessite theme prise en charge or a template edit:

  • description (le meta description) — la plupart themes ne pas print il sans a patch.
  • keywords (per-post mot-clé meta) — et largely pointless anyway; Google a ignored <meta name="keywords"> since 2009. Treat keywords as an organizational aid, pas a classement lever.
  • canonical (override l’URL canonique) — theme-dependent.

Garder the updated: field current quand vous revise a post — sitemap freshness dépend on it (suivant section).

Essential plugins

Sitemap — hexo-generator-sitemap (official):

npm install hexo-generator-sitemap --save
sitemap:
  path:
    - sitemap.xml
  tags: true
  categories: true

Il lit lastmod depuis chaque post’s updated champ (falling back à date) — qui matters parce que Bing warns que lastmod “devrait reflect le vrai dernier modification temps de lune page contenu, pas le sitemap fichier itself.” Après hexo generate, submit le résultating sitemap.xml dans la recherche Google Console et Bing Webmaster Outils. Et heed Bing’s autre warning: “Ne faites pas submit a static sitemap et forget il. Nouveau pages ne va pas obtenir picked up” — pour Hexo que signifie re-deploying et re-submitting (or en utilisant IndexNow) après chaque nouveau post.

robots.txt — hexo-generator-robotstxt:

npm install hexo-generator-robotstxt --save
robotstxt:
  useragent: "*"
  allow:
    - /
  disallow:
    - /private/
  sitemap: https://yourdomain.com/sitemap.xml

Sans it, Hexo produces aucun robots.txt at tout — aucun sitemap pointer pour robots d’exploration.

RSS — hexo-generator-feed: pertinent pour aggregators et Google News eligibility; John Mueller inclut an RSS feed on his propre static site.

IndexNow — hexo-indexnow: Bing recommends pairing sitemaps avec IndexNow pour en temps réel, URL-level submission. Drop le generated clé fichier dans source/ donc il deploys as yourdomain.com/<key>.txt. Remarque ce est pour Bing, Yandex, et others — pas Google, qui ne fait pas utiliser IndexNow pour general pages.

Le par défaut permalink a deux SEO problèmes: renaming le Markdown fichier changements l’URL (parce que le slug comes depuis le filename), et non-Latin titles (Chinese, emoji) produce garbled URLs. hexo-abbrlink decouples l’URL depuis le filename par writing a stable hash back dans front matter:

npm install hexo-abbrlink --save
permalink: posts/:abbrlink/
abbrlink:
  alg: crc32    # crc16 or crc32
  rep: hex      # dec or hex

Vous obtenir quelque chose comme /posts/3a9c2b1d/ que survives fichier renames, category changements, et date edits. Le underlying règle stands soit façon: une fois une URL est publié, ne pas modifier il sans a 301 redirection — a rename sans un destroys popularité des liens et quelconque accumulated classement signaux.

Two plus permalink pitfalls worth knowing avant vous pick a pattern:

  • ne pas utiliser le :id token. Hexo documents post IDs as pas persistent à travers a database cache reset — si votre permalink modèle inclut :id, a cache rebuild peut silently modifier chaque post’s URL. Stick à :title, :abbrlink, or un autre stable token.
  • trailing_index et trailing_html sont séparé contrôle, pas un paramètre. Hexo’s pretty_urls config toggles les independently — un governs si a trailing index.html est stripped depuis generated liens, le autre si a trailing slash est ajouté. Si ces ne pas match comment votre host en réalité resolves URLs (some hosts redirection /post à /post/, others ne pas), vous pouvez fin up avec internal liens, canonicals, et sitemap entries disagreeing avec l’URL le serveur en réalité sert.

Suivant theme SEO configuration

Suivant is the most-used Hexo theme, configuré in _config.next.yml:

canonical: true                 # builds canonical from url: + page path

webmaster_tools:
  google: VERIFICATION_STRING
  bing: VERIFICATION_STRING
  baidu: VERIFICATION_STRING

open_graph:
  enable: true
  twitter_card: summary_large_image

Le Suivant meta-description gap: Suivant ne fait pas automatiquement inject a per-post <meta name="description"> depuis le front matter description:. Vous patch le theme’s head template à fall back depuis page.description à le site description. Ce est le unique la plupart courant Suivant SEO miss. (Suivant fait prise en charge canonical: true et built-dans Ouvrir Graph / Twitter Cards, donc ceux au moins fonctionner une fois enabled.)

Pour non-NexT themes, vous usually créer or edit a head partial to emit og:title, og:description, og:image, og:url, and twitter:card — prise en charge varies widely by theme.

Qui owns chaque balise quand a theme et a plugin les deux emit il. A theme’s built-dans Ouvrir Graph/canonical prise en charge et an tous-dans-un plugin comme hexo-seo (qui generates son propre breadcrumb, site web, et article schema) peut les deux essayer à écrire le même balise. Turning les deux on produces duplicate or conflicting <meta> balises, canonicals, or JSON-LD bloque dans le même <head>. Pick un couche as le owner pour chaque balise category — theme or plugin, pas les deux — et disable le corresponding fonctionnalité on le autre avant vous ship.

Category et balise pages: le duplicate-contenu trap

Hexo auto-generates an archive page pour chaque category et chaque balise, chaque filled avec post excerpts que aussi apparaître on le posts themselves. À scale c’est hundreds de thin pages competing pour le même requêtes et diluting explorer attention. Votre options:

  1. sitemap: false per archive (impractical à scale).
  2. Theme-level noindex on le category/balise archive templates.
  3. Garder les indexé seulement si a category est a genuine, curated topic hub avec réel valeur.
  4. Self-referencing canonical on chaque paginated archive page (page 2 canonicalizes à itself, pas page 1).

Un caveat on option 2: à long terme noindex eventually rend Google arrêter suivant le liens on que page, donc noindexing balise pages peut reduce exploration de posts que sont seulement lié depuis ceux balises. Assurez-vous tel posts sont reachable some autre façon.

Votre route inventory est bigger que source/. Category, balise, archive, et pagination pages ne pas come depuis Markdown fichiers — Hexo’s generator API est ce que en réalité crée les, et themes or plugins peut register leur propre generators aussi. Que signifie le crawlable URL surface peut silently expand au-delà ce que vous’d expect depuis browsing votre source/ folder. Après installing or updating a theme or plugin, exécuter hexo generate et diff le route liste dans public/ plutôt que assuming vous know chaque URL Hexo est producing.

Données structurées / JSON-LD

«Hexo injects no structured data by default. Either add a BlogPosting JSON-LD block to your theme’s post template (headline, datePublished, dateModified, author, publisher, url) or use an all-in-one plugin like hexo-seo that generates breadcrumb, website, and article schema for you. » (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.)

Core Web Vitals

Static sortie est rapide, mais themes peut undo que. Suivant et nombreux themes bundle grand JS/CSS et icon-font libraries (Font Awesome est a frequent LCP/rendre-blocking culprit). Audit avec Lighthouse, alors reach pour hexo-all-minifier (HTML/CSS/JS compression à construire temps), hexo-lazyload-image, et defer/async on tiers scripts comme analytics et ads.

Targeting Baidu (Chinese-audience sites)

Baidu’s robot d’exploration handles JavaScript poorly, donc Hexo’s static HTML supprime un obstacle à Baidu discovery. Ajouter baidu_site_verification dans Suivant, generate a Baidu-format sitemap avec hexo-generator-baidu-sitemap, et push URLs actively avec hexo-submit-urls-to-search-engine. Un hosting remarque: GitHub Pages est bloqué dans mainland China — utiliser Gitee Pages, Cloudflare, or a Chinese CDN pour Baidu trafic.

Treat que as a crawlability advantage, pas a guarantee. Static HTML doesn’t by itself prove Baidu is discovering, indexation, or ranking votre pages — confirmer réel explorer activity and indexation status directement in Baidu Ziyuan (Baidu’s webmaster outils) plutôt que assuming static output alone secures visibility.

Deploying à GitHub Pages — le SEO gotchas

  • Définir url: à votre actif adresse (custom domain avec https://) avant le premier deploy.
  • Put a CNAME fichier dans source/ pour custom domains donc il n’est pas reset on chaque hexo deploy.
  • Enforce HTTPS dans repo Paramètres → Pages après DNS propagates.
  • Préférer a GitHub Actions workflow over hexo-deployer-git à éviter CNAME-reset problèmes.

Hexo vs. Hugo vs. Jekyll vs. Astro, pour le SEO

«All four ship pure static HTML, so the indexability floor is identical — there’s no framework-level SEO disadvantage in Hexo. The differences are operational: Hugo (Go) builds far faster at large scale and has a built-in sitemap; Jekyll is the GitHub Pages default; Astro ships zero JS by default via islands. Hexo’s edge is a rich npm plugin ecosystem and a large Chinese-language community. Content quality, not the generator, decides rankings — as Mueller said of switching generators, “Will your site’s SEO suddenly explode? No. Also No.” » (Traduction) (Résumé en français de la section soixante-quinze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)

Pour le cluster overview et le autre generators, voir Static Site Generators; pour le broader rendu picture, voir JavaScript SEO.

Ajouter une note d’expert

Épingler une citation d’expert

Nouvelle personne ? Créez son profil non revendiqué à /admin/experts/ → Épingler une citation d’expert d’abord.