تحسين SEO في Hexo

كيفية تطبيق SEO في موقع Hexo، مولّد المواقع الثابتة المبني على Node.js: مزايا HTML الثابت، وضبط خرائط الموقع وrobots.txt والأوصاف وcanonical والروابط الدائمة.

نُشر أول مرة: 26 يونيو 2026 · آخر تحديث: 22 أغسطس 2026 · Advanced
اللغات

Hexo مولّد مواقع ثابتة مبني على Node.js؛ يحوّل hexo generate ملفات Markdown إلى HTML ثابت خالص، فيقرأ Googlebot المحتوى كاملاً من أول جلب بلا قائمة انتظار لعرض JavaScript. وهذه قاعدة قابلية الزحف لا SEO مكتملاً. لا توفر معظم القوالب الافتراضية خريطة موقع أو robots.txt أو وصف meta لكل مقال أو canonical أو بيانات منظمة؛ بل تضيفها عبر _config.yml وترويسة المقال وتعديلات القالب والإضافات. وأهم الفخاخ قيمة url: الخاطئة، والرابط الافتراضي القائم على التاريخ الذي ينكسر عند إعادة التسمية، وأرشيفات الفئات والوسوم منخفضة القيمة. أما المواقع الموجهة إلى Baidu فيزيل لها الناتج الثابت عائقاً حقيقياً في الزحف، لكنه لا يضمن الفهرسة أو الترتيب.

الخلاصة — ينتج hexo generate ملفات HTML ثابتة خالصة، فيوجد المحتوى في أول بايت من الاستجابة بلا خدمة عرض ويب ولا تأخير للموجة الثانية. هذه قاعدة قابلية الزحف، وليست SEO مكتملاً. لا توفر القوالب الافتراضية خريطة موقع أو robots.txt أو وصف meta لكل مقال أو canonical أو بيانات منظمة؛ بل تضيفها عبر _config.yml وترويسة المقال وتعديلات القالب والإضافات. وأهم الفخاخ: قيمة url: الخاطئة تفسد canonical والخريطة والخلاصة؛ ونمط الرابط الافتراضي القائم على التاريخ يربط URL باسم الملف؛ وصفحات أرشيف الفئات والوسوم تنشئ محتوى مكرراً منخفض القيمة. أما المواقع الموجهة إلى Baidu فيمنحها الناتج الثابت ميزة حقيقية في الزحف.

الناتج الثابت لـHexo هو ميزة الزحف

يمرر hexo generate ملفات Markdown وقوالب التصميم عبر خطوة بناء، ويكتب مجلداً من HTML وCSS والأصول المكتملة. والحقيقة المهمة لـSEO هي متى يوجد HTML: مرة عند البناء وللجميع، لا عند كل طلب ولا في المتصفح. Evidence for this claim The Hexo generate command builds static files into the configured public directory. Scope: Hexo generate command. Confidence: high · Verified: Hexo: Commands

تصف Google مرحلتين لصفحات JavaScript: تجلب الموجة الأولى HTML الخام وتفهرس المحتوى الثابت فوراً، أما الثانية فهي قائمة مؤجلة لعرض Chromium بلا واجهة وقد تستغرق ثواني أو أياماً. يتجاوز ناتج Hexo الموجة الثانية بالكامل؛ فكل صفحة HTML خام عند أول جلب. وتقول إرشادات Google إن العرض الديناميكي “a workaround and not a long-term solution… use server-side rendering, static rendering, or hydration as a solution” (ترجمة) «حل التفافي لا حل طويل الأجل… استخدم العرض من جهة الخادم أو العرض الثابت أو hydration». وينتج Hexo العرض الثابت، وهو أحد الأساليب الثلاثة الموصى بها صراحةً.

وينتج عن ذلك مكسبان آخران:

  • روابط قابلة للزحف افتراضياً. تُخرج قوالب Hexo روابط <a href> عادية في HTML الثابت، فتستوفي شرط Google بأن تكون الروابط عناوين حقيقية قابلة للزحف، بلا تنقل مولّد بـJavaScript.
  • زحف منخفض التكلفة. تكاد الملفات الثابتة المقدمة من CDN لا تستهلك معالجة في الخادم لكل طلب، فيزحف Googlebot بالمعدل المسموح بلا خفض بسبب العبء. وكما قال Gary Illyes: “if you are making expensive database calls, that’s going to cost the server a lot” (ترجمة) «إذا أجريت استدعاءات مكلفة لقاعدة البيانات فسيكلف ذلك الخادم كثيراً»؛ ولا يجري Hexo أياً منها.

تنبيه: غياب ما يعطل العرض للزواحف لا يعني غيابه للمستخدمين. فما زالت JavaScript وCSS في القالب تؤثران في Core Web Vitals.

اضبط _config.yml أولاً؛ وurl: هو الأهم

اضبط هذه المفاتيح العامة قبل أول نشر:

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: أهم إعداد منفرد. إنه عنوان الموقع الأساسي الذي تستخدمه القوالب والمولّدات لوسوم canonical والخلاصات وخرائط الموقع وتقسيم الصفحات. وقد تنتشر قيمة خاطئة في كل هذه المخرجات. Evidence for this claim Hexo's url configuration supplies the website URL used by themes and generators. Scope: Exact downstream fields depend on the installed theme and plugins. Confidence: high · Verified: Hexo: Configuration
  • permalink: — ينتج الافتراضي :year/:month/:day/:title/ عناوين قائمة على التاريخ تبدو قديمة مع الوقت وتربط slug باسم الملف. ومن الخيارات الأنظف /:title/ أو /:category/:title/.
  • يزيل meta_generator: false بصمة مولّد Hexo من <head>.
  • هل تنشر في مجلد فرعي؟ لا تكفي url:؛ اضبط root: على مسار المجلد مثل root: /blog/. يبني url_for روابط نسبةً إلى الجذر، بينما يضيف full_url_for قيمة url: كاملة. والخطأ في root: يجعل الروابط والخلاصات ومدخلات الخريطة تشير إلى جذر النطاق لا المسار الحقيقي.
  • أولوية الإعداد: يحدد _config.yml للموقع قيم url وroot وpermalink، ثم تُضاف إعدادات القالب، سواء من ملفه المرفق _config.yml أو من _config.<theme>.yml في جذر المشروع، للعرض من دون تجاوز بنية URL؛ فلا يستطيع القالب إصلاح url: خاطئ.
  • الاختبار في الوضع الآمن؟ يعطل hexo server --safe أو hexo --safe كل إضافة وبرنامج، فيغيب عن الناتج ملف الخريطة وrobots.txt ووسوم إضافات SEO. لا تستخدم معاينة الوضع الآمن لفحص SEO؛ شغّل hexo generate عادياً أولاً.

عناصر تحكم SEO في ترويسة المقال وما ينقصها

يمكنك الاعتماد على حقول ترويسة المقال الأصلية في Hexo التالية:

---
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
---

ما لا توفره ترويسة المقال الأصلية ويحتاج إلى دعم القالب أو تعديل قالب:

  • description، أي وصف meta: لا تطبعه معظم القوالب بلا تعديل.
  • keywords، كلمات meta لكل مقال: وهي عديمة الجدوى إلى حد كبير؛ فقد تجاهلت Google <meta name="keywords"> منذ 2009. تعامل معها أداة تنظيم لا وسيلة ترتيب.
  • canonical، أي تحديد قيمة canonical بديلة: يعتمد على القالب.

حافظ على تحديث الحقل updated: عند مراجعة المقال؛ إذ تعتمد حداثة خريطة الموقع عليه.

الإضافات الأساسية

خريطة الموقع — hexo-generator-sitemap (رسمية):

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

تقرأ الإضافة lastmod من حقل updated لكل مقال، وتعود إلى date عند غيابه. وهذا مهم لأن Bing تحذر من أن lastmod “should reflect the true last modification time of the page content, not the sitemap file itself.” (ترجمة) «ينبغي أن يعكس وقت آخر تعديل حقيقي لمحتوى الصفحة لا لملف الخريطة نفسه». بعد hexo generate، أرسل sitemap.xml الناتج إلى Google Search Console وBing Webmaster Tools. وانتبه لتحذير Bing الآخر: “Do not submit a static sitemap and forget it. New pages won’t get picked up” (ترجمة) «لا ترسل خريطة ثابتة ثم تنسها، فالصفحات الجديدة لن تُلتقط». وفي Hexo يعني ذلك إعادة النشر والإرسال أو استخدام IndexNow بعد كل مقال جديد.

ملف robots.txt — hexo-generator-robotstxt:

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

من دونها لا ينتج Hexo ملف robots.txt إطلاقاً، ولا توجد إشارة إلى خريطة الموقع للزواحف.

RSS — hexo-generator-feed: مهم للمجمّعات وأهلية Google News؛ ويستخدم John Mueller نفسه خلاصة RSS في موقعه الثابت.

IndexNow — hexo-indexnow: توصي Bing بقرن خرائط الموقع بـIndexNow للإرسال الفوري على مستوى URL. ضع ملف المفتاح الناتج في source/ لينشر في yourdomain.com/<key>.txt. وهذا مخصص لـBing وYandex وغيرهما، لا Google التي لا تستخدم IndexNow للصفحات العامة.

يعاني الرابط الافتراضي مشكلتين في SEO: يغير تبديل اسم ملف Markdown عنوان URL لأن slug يأتي من اسم الملف، وتنتج العناوين غير اللاتينية رموزاً مشوهة. تفصل hexo-abbrlink العنوان عن اسم الملف بكتابة تجزئة ثابتة في ترويسة المقال:

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

تحصل على عنوان مثل /posts/3a9c2b1d/ يبقى عند تغيير اسم الملف أو الفئة أو التاريخ. وتظل القاعدة: بعد نشر URL لا تغيّره بلا إعادة توجيه 301؛ فتغيير الاسم من دونها يهدر قيمة الروابط وإشارات الترتيب المتراكمة.

وثمة فخان آخران ينبغي معرفتهما قبل اختيار النمط:

  • لا تستخدم الرمز :id. توثق Hexo أن معرفات المقالات لا تبقى بعد إعادة ضبط ذاكرة قاعدة البيانات المؤقتة؛ وقد يغير إعادة بنائها عناوين كل المقالات بصمت. استخدم :title أو :abbrlink أو رمزاً ثابتاً آخر.
  • trailing_index وtrailing_html عنصران منفصلان. يبدلهما إعداد pretty_urls كلٌ على حدة؛ أحدهما يزيل index.html اللاحق من الروابط، والآخر يضيف شرطة مائلة نهائية. وإذا لم يطابقا طريقة حل المضيف للعناوين، إذ يعيد بعض المضيفين توجيه /post إلى /post/ ولا يفعل آخرون، فقد تختلف الروابط الداخلية وcanonical والخريطة عن URL الذي يقدمه الخادم فعلاً.

إعداد SEO في قالب NexT

NexT أشهر قوالب Hexo، ويُضبط في _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

فجوة وصف meta في NexT: لا يحقن NexT تلقائياً <meta name="description"> لكل مقال من description: في ترويسة المقال. عليك تعديل قالب الرأس ليستخدم page.description ثم يعود إلى وصف الموقع عند غيابه. وهذه أكثر هفوات SEO شيوعاً في NexT. لكنه يدعم canonical: true وOpen Graph وTwitter Cards بعد تفعيلها.

في القوالب الأخرى، تنشئ أو تعدل عادةً جزء الرأس لإخراج og:title وog:description وog:image وog:url وtwitter:card؛ ويختلف الدعم كثيراً بين القوالب.

من يملك كل وسم عندما يخرجه القالب والإضافة معاً؟ قد يحاول دعم Open Graph وcanonical في القالب وإضافة شاملة مثل hexo-seo كتابة الوسم نفسه. وتشغيلهما معاً ينتج وسوم <meta> أو canonical أو كتل JSON-LD مكررة أو متعارضة في <head>. اختر طبقة واحدة مالكة لكل فئة وسوم، القالب أو الإضافة، وعطّل الميزة المقابلة في الأخرى قبل النشر.

صفحات الفئات والوسوم: فخ المحتوى المكرر

ينشئ Hexo تلقائياً صفحة أرشيف لكل فئة ووسم، مليئة بمقتطفات تظهر أيضاً في المقالات نفسها. وعلى نطاق واسع يصبح ذلك مئات الصفحات منخفضة القيمة التي تتنافس على الاستعلامات نفسها وتشتت انتباه الزحف. خياراتك:

  1. sitemap: false لكل أرشيف، وهو غير عملي على نطاق واسع.
  2. إضافة noindex في قوالب أرشيف الفئات والوسوم.
  3. إبقاؤها مفهرسة فقط إذا كانت الفئة مركز موضوع منسقاً وحقيقياً ذا قيمة.
  4. استخدام canonical ذاتي المرجع لكل صفحة من الأرشيف المقسّم؛ تشير الصفحة 2 إلى نفسها لا إلى الصفحة 1.

تنبيه للخيار الثاني: يؤدي noindex طويل الأجل في النهاية إلى توقف Google عن اتباع روابط الصفحة، وقد يقلل الزحف إلى مقالات لا تصل إليها إلا عبر تلك الوسوم. تأكد من إمكان الوصول إليها بطريقة أخرى.

قائمة مساراتك أكبر من source/. لا تأتي صفحات الفئات والوسوم والأرشيف والتقسيم من ملفات Markdown؛ بل تنشئها واجهة مولّد Hexo، ويمكن للقوالب والإضافات تسجيل مولّداتها أيضاً. لذلك قد يتوسع سطح URL القابل للزحف بصمت أبعد مما تتوقعه عند تصفح source/. بعد تثبيت قالب أو إضافة أو تحديثهما، شغّل hexo generate وقارن قائمة المسارات في public/ بدلاً من افتراض معرفتك بكل URL ينتجه Hexo.

البيانات المنظمة وJSON-LD

لا يحقن Hexo بيانات منظمة افتراضياً. إما أن تضيف كتلة JSON-LD من نوع BlogPosting إلى قالب المقال، مع headline وdatePublished وdateModified وauthor وpublisher وurl، أو تستخدم إضافة شاملة مثل hexo-seo تولد schema لمسار التنقل والموقع والمقال.

مؤشرات Core Web Vitals

الناتج الثابت سريع، لكن القوالب قد تهدر ذلك. تجمع NexT وقوالب كثيرة مكتبات كبيرة من JS وCSS وخطوط الأيقونات، وكثيراً ما يكون Font Awesome سبباً في LCP أو حجب العرض. راجع باستخدام Lighthouse، ثم استخدم hexo-all-minifier لضغط HTML/CSS/JS وقت البناء وhexo-lazyload-image وdefer أو async لبرامج الجهات الخارجية.

استهداف Baidu للمواقع ذات الجمهور الصيني

لا يتعامل زاحف Baidu جيداً مع JavaScript، لذلك يزيل HTML الثابت في Hexo عائقاً أمام الاكتشاف. أضف baidu_site_verification في NexT، وأنشئ خريطة بصيغة Baidu عبر hexo-generator-baidu-sitemap، وادفع العناوين عبر hexo-submit-urls-to-search-engine. ملاحظة استضافة: GitHub Pages محجوب في بر الصين الرئيسي؛ استخدم Gitee Pages أو Cloudflare أو CDN صينياً لزيارات Baidu.

تعامل مع ذلك كميزة في قابلية الزحف لا ضماناً. لا يثبت HTML الثابت وحده أن Baidu يكتشف صفحاتك أو يفهرسها أو يرتبها؛ تحقق من نشاط الزحف وحالة الفهرسة مباشرةً في Baidu Ziyuan بدلاً من افتراض أن الناتج الثابت يضمن الظهور.

النشر على GitHub Pages: فخاخ SEO

  • اضبط url: على عنوانك المنشور، بنطاق مخصص وhttps://، قبل أول نشر.
  • ضع ملف CNAME في source/ للنطاقات المخصصة كي لا يُعاد ضبطه مع كل hexo deploy.
  • افرض HTTPS من Settings ← Pages في المستودع بعد انتشار DNS.
  • فضّل سير عمل GitHub Actions على hexo-deployer-git لتجنب مشكلات إعادة ضبط CNAME.

Hexo مقابل Hugo وJekyll وAstro من منظور SEO

تنتج الأربعة HTML ثابتاً خالصاً، لذلك قاعدة قابلية الفهرسة متطابقة، ولا عيب في Hexo على مستوى الإطار. الفروق تشغيلية: يبني Hugo بلغة Go أسرع كثيراً على نطاق واسع ويوفر خريطة مدمجة؛ وJekyll هو افتراضي GitHub Pages؛ ويقدم Astro صفراً من JS افتراضياً عبر الجزر. وميزة Hexo منظومة إضافات npm غنية ومجتمع صيني كبير. تحدد جودة المحتوى الترتيب لا المولّد. وكما قال Mueller عن تبديل المولّدات: “Will your site’s SEO suddenly explode? No. Also No.” (ترجمة) «هل سينفجر SEO في موقعك فجأة؟ لا، ولا أيضاً».

للاطلاع على نظرة عامة إلى المجموعة والمولّدات الأخرى، راجع مولّدات المواقع الثابتة؛ وللصورة الأشمل للعرض، راجع SEO وJavaScript.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.