لماذا لا تفهرس جوجل صفحات SPA؟
يحوّل KIT صفحة تُبنى بجافا سكريبت — SPA مبنية باستخدام React أو Vue.js أو ما شابه — إلى HTML كامل جاهز، فيراها محرك البحث والروبوتات كصفحة عادية مكتملة المحتوى، بينما يبقى الزائر البشري على النسخة التفاعلية نفسها. تناسب الأداة أي موقع لا تظهر صفحاته في نتائج البحث رغم اكتمال محتواها بصريًا.
شغّلها أونلاين
شغّل هذه المهمة على خوادمنا باستخدام حسابك. الأدوات المجانية تعمل داخل متصفحك، أما هذه فتُخصم من رصيدك في KIT حسب السعر الموضّح أعلاه.
المشكلة التي يحلّها التصيير المسبق
تبني كثير من المواقع الحديثة محتواها داخل المتصفح عبر JavaScript بعد تحميل الصفحة، فإذا زارها روبوت لا ينفّذ JavaScript كاملًا — أو يمنحه وقتًا قصيرًا فقط — رأى ملف HTML شبه فارغ، دون عنوان ودون نص ودون وصف منتج. لا يقتصر الأمر على محركات البحث القديمة، بل يشمل معاينة الروابط في واتساب ومواقع التواصل، التي لا تُشغّل الصفحة كاملة غالبًا، فتظهر صندوقًا فارغًا حيث كان يُفترض أن يظهر العنوان والصورة.
كيف يعمل التصيير من الداخل
يحمّل متصفح حقيقي الصفحة كاملة، وينتظر حتى يبني JavaScript محتواها، قبل أن يُحفَظ الناتج كملف HTML ثابت جاهز. يُسلَّم هذا الملف لاحقًا إلى الروبوت أو الزاحف عند طلبه، بينما يستمر الزائر البشري في تلقي النسخة التفاعلية نفسها دون أي تغيير. لا يتغيّر بناء الموقع الأصلي في شيء، بل تُضاف نسخة جاهزة إضافية مخصّصة للروبوتات فقط، وتُحدَّث هذه النسخة تلقائيًا عند كل طلب جديد بدل الاحتفاظ بلقطة قديمة قد لا تعكس آخر تعديل على الصفحة.
تشغيله دون خادوم إضافي
بناء خدمة تصيير خاصة يعني عادة عبئًا إضافيًا على الخادوم، إلى جانب مهمة التمييز بين زائر بشري وروبوت زحف حقيقي. تتولى هذه الخدمة المهمة مركزيًا: تُرسل الرابط عبر هذه الصفحة أو عبر الـAPI، ويعود لك ملف HTML جاهز، بسعر $0.040 للطلب زائد $0.001 عن كل رابط إضافي. يغنيك ذلك عن تشغيل متصفح بلا واجهة على خادومك، وعن صيانة هذه البنية التحتية باستمرار.
ما يبقى عليك التحقق منه بعد التصيير
التصيير المسبق لا يغني عن التحقق من أن الصفحة قابلة للفهرسة أصلًا: توجيهات ملف robots.txt والوسم canonical ورمز الحالة تبقى فاعلة كما هي، وأي وسم noindex موضوع بالخطأ يظل يمنع الفهرسة حتى بعد التصيير. يمكن أيضًا التأكد من أن جوجل يقرأ الصفحة كما هو متوقع عبر أداة Search Console التابعة لجوجل، بدل الاكتفاء بالتصيير وحده وتجاهل السبب الحقيقي وراء أي مشكلة فهرسة قائمة.
حالات الاستخدام
إعادة بناء موقع متجر بواسطة React
تعيد شركة الخليج الرقمية بناء واجهة متجرها باستخدام React، وتُصيّر صفحات المنتجات مسبقًا حتى يستمر جوجل في قراءة العنوان والوصف كما كان قبل التحديث.
معاينة روابط فارغة في واتساب
بعدما لاحظت نورة القحطاني أن رابط صفحتها التسويقية يظهر في واتساب كصندوق فارغ بلا عنوان ولا صورة، فعّلت التصيير المسبق فعاد ظهور المعاينة كاملة.
الانتقال من نظام إدارة محتوى إلى Vue.js
قبل الانتقال من نظام إدارة محتوى تقليدي إلى تطبيق مبني باستخدام Vue.js، يتحقق محمد الحربي من أن صفحات التصنيفات الرئيسية ما زالت تصل كاملة النص إلى جوجل.
تراجع الفهرسة بعد التحوّل إلى SPA
بعد أشهر من تراجع عدد الصفحات المفهرسة في Search Console عقب التحوّل إلى SPA، يفعّل متجر إلكتروني صغير التصيير المسبق لصفحات منتجاته الأساسية.
الأسئلة الشائعة
هل يرى الزائر البشري النسخة المصيَّرة أيضًا؟
لا. يستمر الزائر البشري في تلقي الصفحة التفاعلية العادية، بينما تُسلَّم النسخة المصيَّرة للروبوتات وزاحف محركات البحث فقط.
هل يُعامَل هذا كخداع (cloaking) من جوجل؟
لا، ما دام المحتوى المعروض للروبوت مطابقًا لما يراه الزائر البشري. الخداع يعني عرض محتوى مختلف عمدًا، وهو ما لا تفعله هذه الخدمة.
هل يُصيَّر محتوى محمي خلف تسجيل دخول؟
لا. يُصيَّر فقط ما يستطيع أي زائر عادي رؤيته دون تسجيل دخول؛ الصفحات المحمية خلف حساب لا تدخل ضمن هذا الفحص.
كم تكلفة تصيير رابط واحد؟
$0.040 للطلب الواحد، إضافة $0.001 عن كل رابط إضافي، بصرف النظر عن حجم الصفحة نفسها.
هل أحتاج إلى حساب؟
لا توجد حسابات حاليًا. تدفع مباشرة عبر PayPal مقابل كل استخدام، أو تراسلنا إن لم يناسبك ذلك.
هل يغني هذا عن التصيير من جهة الخادوم في إطار العمل نفسه؟
ليس بالضرورة. من يملك بالفعل تصييرًا من جهة الخادوم لا يحتاج هذه الخدمة عادة؛ فهي موجَّهة لمن يبني صفحاته بجافا سكريبت في المتصفح فقط ولا يريد إضافة تصيير خاص به.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/web/prerender \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://ejemplo.com"}'const res = await fetch("https://api.kit.forhosting.com/web/prerender", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"url": "https://ejemplo.com"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/prerender",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"url": "https://ejemplo.com"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/prerender", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"url":"https://ejemplo.com"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"url":"https://ejemplo.com"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/prerender", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"url": "https://ejemplo.com"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.prerender",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
timeout_sec | 30 |
max_crawl_pages | 25 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |
422 | task_failed | لم تنجح معالجة المهمة، ولن تُحتسب عليك؛ أعد المحاولة أو راسلنا مباشرة. |