افحص تعارض canonical ومخاطر النطاقات المختلفة
قد يبدو وسم canonical صحيحاً، لكنه يوجّه محركات البحث بصمت بعيداً عن الصفحة المراد فهرستها. تقارن هذه الأداة رابط الصفحة بالرابط المعلن في الوسم، وتبيّن التطابق بعد تسوية آمنة، وتعدّ اختلاف نطاق الوجهة خطراً مرتفعاً. وبذلك يمكنكم مراجعة تغييرات القوالب وعمليات النقل وأخطاء النشر قبل أن تضعف إشارات الفهرسة أو تنقل القيمة إلى عنوان غير مقصود.
شغّل الأداة مجانًا
ما معنى تعارض canonical
يخبر وسم canonical محركات البحث بالرابط الذي ينبغي أن يمثل الصفحة عندما تعرض عناوين متعددة محتوى واحداً أو شديد التشابه. وعادة يكرر الوسم الذاتي رابط الصفحة نفسه، فيمنح برامج الزحف عنواناً مفضلاً واضحاً. يحدث التعارض عندما ينتج عن رابط الصفحة المرسل وقيمة canonical نصان مختلفان بعد التسوية. وقد يكون الاختلاف مقصوداً، مثل جمع إشارات رابط تتبع في صفحة منتج نظيفة، لكنه يستحق المراجعة لأنه قد ينقل إشارات الفهرسة بعيداً عن العنوان الحالي. تعرض النتيجة الرابطين بعد التحليل، وصيغتي المقارنة من دون الأجزاء المرجعية، ومؤشري التطابق والتعارض، ورسالة واضحة. لا تزحف الأداة إلى أي وجهة ولا تحكم على تكافؤ محتوى صفحتين؛ بل تجيب بصورة حتمية عن سؤال تقني محدد: هل يشير الوسم إلى رابط الصفحة المقدم؟ لذلك تناسب اختبارات النشر والتدقيق ومسارات ضبط المحتوى والاختبارات الآلية التي تحتاج إلى جواب مفهوم وقابل للتكرار.
كيفية التحقق من الروابط ومقارنتها
أدخلوا عنوان HTTP أو HTTPS المطلق للصفحة، والقيمة المطلقة الموجودة في وسم canonical. تُحلل القيمتان كرابطين، وتُرفض القيم المشوهة والمسارات النسبية والبروتوكولات غير المدعومة والحقول الناقصة والعناوين التي تتضمن بيانات اعتماد. تمنع هذه الصرامة اعتبار جزء HTML أو اسم مضيف منفرد أو مسار مثل /products/item وجهة كاملة. عند المقارنة، يسوّي محلل الروابط القياسي تفاصيل مثل حالة أحرف اسم المضيف والمنافذ الافتراضية المكتوبة صراحة. وتُحذف الأجزاء المرجعية لأنها تحدد موضعاً داخل المستند نفسه، لا مستنداً آخر. أما البروتوكول واسم المضيف والمسار والاستعلام والمنفذ غير الافتراضي فتبقى ذات معنى. لا تحذف الأداة معاملات التتبع، ولا توحّد نسخ www، ولا تفرض HTTPS، ولا تعدّ اختلاف الشرطة المائلة الأخيرة متساوياً. فقد تخفي هذه التحويلات خللاً حقيقياً في القالب. وتوضح القيم المسوّاة المعادة سبب الإبلاغ عن أي اختلاف بدقة.
لماذا يمثل اختلاف النطاق خطراً مرتفعاً
قد يكون توجيه canonical إلى مضيف آخر مشروعاً في المقالات المعاد توزيعها أو المحتوى المرخص أو نقل نطاق مضبوط بعناية. وقد يكون أيضاً خطأ إنتاجياً مؤذياً سببه إعداد بيئة تجريبية أو نطاق قديم أو قالب منسوخ أو ترميز عُدّل دون إذن. لذلك تصنّف الأداة كل تغيير في اسم المضيف إحالةً بين نطاقين وخطراً مرتفعاً، حتى إن كان مقصوداً. ويعني الخطر المرتفع أولوية المراجعة لا الجزم بوجود خطأ. تحققوا من فهم الأطراف لعملية الدمج، ومن أن الوجهة هي النسخة المعتمدة، ومن توافق التحويلات وخرائط الموقع والروابط الداخلية وhreflang مع القرار. وتحصل الاختلافات داخل النطاق نفسه على تحذير، لأنها قد تدمج الصفحة في فئة أو منتج أو لغة أو نسخة معاملات غير مقصودة. أما التطابق فلا يحمل خطراً. استخدموا الفحص عند النشر والنقل وتغيير المسارات والقوالب، ويمكنكم في CI إيقاف التعارضات غير المتوقعة وطلب اعتماد صريح لكل نتيجة بين نطاقين.
حالات الاستخدام
كشف تسرب نطاق البيئة التجريبية
قارنوا صفحة الإنتاج بوسمها، وحددوا فوراً أي مضيف تجريبي أو مضيف معاينة بقي في الترميز.
اختبار القوالب بعد النشر
افحصوا أزواجاً ممثلة بعد تغيير CMS أو التوجيه، لكشف التغير غير المقصود في المسار أو الاستعلام أو البروتوكول أو المضيف.
مراجعة إشارات نقل الموقع
اكتشفوا الإحالات بين النطاقات أثناء النقل، وطابقوا كل نتيجة عالية المخاطر مع خريطة النقل المعتمدة.
الأسئلة الشائعة
ما الذي يُعد تطابقاً؟
يجب أن يتطابق رابطا HTTP أو HTTPS بعد التسوية القياسية وحذف الأجزاء المرجعية. وتظل الفروق في المسارات والاستعلامات والبروتوكولات والمضيفين مؤثرة.
لماذا يُعد canonical بين نطاقين عالي المخاطر؟
قد يدمج محتوى موزعاً أو منقولاً، لكنه قد يرسل الإشارات أيضاً إلى بيئة تجريبية أو نطاق قديم أو طرف آخر. راجعوا كل حالة.
هل تجلب الأداة أياً من الرابطين؟
لا. تنفذ تحققاً ومقارنة حتميين فقط، ولا تفحص المحتوى أو التحويلات أو حالة HTTP أو توجيهات robots أو وسم الوجهة.
هل تقبل قيم canonical النسبية؟
لا. يجب أن تكون القيمة رابط HTTP أو HTTPS مطلقاً كي تكون الوجهة صريحة من دون اختراع عنوان أساس.
هل يعني الاختلاف دائماً أن الوسم خاطئ؟
لا. قد تستخدم نسخ المعاملات والصفحات المكررة والتوزيع والنقل رابطاً مختلفاً عن قصد. الاختلاف إشارة للمراجعة، وتزداد الأولوية بين النطاقات.
ما تكلفة الفحص عبر API؟
تكلفة كل طلب API هي $0.002. وتنفذ نسخة المتصفح المقارنة الحتمية نفسها محلياً مجاناً.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/seo/canonical-conflict-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"page_url":"https://www.example.com/products/blue-widget","canonical_url":"https://www.example.com/products/blue-widget"}'const res = await fetch("https://api.kit.forhosting.com/seo/canonical-conflict-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"page_url": "https://www.example.com/products/blue-widget",
"canonical_url": "https://www.example.com/products/blue-widget"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/canonical-conflict-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"page_url": "https://www.example.com/products/blue-widget",
"canonical_url": "https://www.example.com/products/blue-widget"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/canonical-conflict-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"page_url":"https://www.example.com/products/blue-widget","canonical_url":"https://www.example.com/products/blue-widget"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"page_url":"https://www.example.com/products/blue-widget","canonical_url":"https://www.example.com/products/blue-widget"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/canonical-conflict-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"page_url": "https://www.example.com/products/blue-widget",
"canonical_url": "https://www.example.com/products/blue-widget"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.canonical_conflict_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |