تحسين محركات البحث في Next.js
كيفية جعل موقع Next.js قابلاً للزحف والفهرسة والترتيب، مع شرح نظامي التوجيه وأنماط العرض وMetadata API وsitemap.ts وrobots.ts وnext/image وnext/link والأخطاء التي تعطّل ذلك بصمت.
اللغات
يحل Next.js أصعب مشكلات SEO الخاصة بـJavaScript افتراضياً إذا استُخدم على نحو صحيح. تضع Server Components وSSG/ISR المحتوى في HTML من دون انتظار طابور العرض، وتحل Metadata API العناوين والروابط الأساسية وOpen Graph على الخادم، فيما يمثل sitemap.ts وrobots.ts اصطلاحين للملفات. يمنحك الإطار البنية الأساسية لكنه لا يكتب الوسوم نيابة عنك. الأخطاء متوقعة: غياب metadataBase، وعدم ضبط priority لصورة LCP، وتصدير metadata من Client Component، وإرجاع صفحات 404 للحالة 200.
الخلاصة — يُعد Next.js من أفضل أطر العمل لـSEO عندما تستخدمه على نحو صحيح. أنشئ صفحاتك على الخادم أو وقت البناء، لا بالكامل في المتصفح، واضبط لكل صفحة عنواناً ووصفاً ورابطاً أساسياً فريداً، واستخدم مكوّني
next/imageوnext/linkالمدمجين. يمنحك Next.js كل الأدوات، لكنه لن يكتب وسوم SEO نيابة عنك.
ما تحسين محركات البحث في Next.js؟
Next.js إطار عمل شائع مبني على React لإنشاء المواقع وتطبيقات الويب. ولأنه يستخدم React داخلياً، يمكن بناء جزء كبير من الصفحة بـJavaScript، وهنا تظهر أسئلة SEO. يعني SEO في Next.js ببساطة ضمان قدرة محركات البحث على زحف موقع Next.js وعرضه وفهرسته، واستخدام ميزات الإطار المدمجة لتنفيذ ذلك جيداً.
الخبر الجيد أن Next.js يستطيع بناء صفحاتك مسبقاً أو على الخادم، فتحصل محركات البحث على HTML المكتمل فوراً. وهذا يتجنب أكبر مخاطر مواقع JavaScript: المحتوى الذي لا يظهر إلا بعد تشغيل النصوص البرمجية. وللسياق الأوسع راجع SEO في JavaScript.
القرار الكبير: أين تُبنى الصفحة؟
عندما يطلب شخص، أو Googlebot، صفحةً ما، فمن أين يأتي HTML المكتمل؟ يوفر Next.js عدة خيارات:
- وقت البناء (Static / SSG) — تُبنى الصفحة مسبقاً كملف HTML عادي. وهو خيار سريع تحصل فيه محركات البحث على كل شيء فوراً.
- على الخادم لكل طلب (SSR) — يبني الخادم الصفحة كاملة كل مرة. وهو ملائم للبحث ودائم الحداثة.
- مزيج (ISR) — صفحات ثابتة تتجدد وفق مؤقت، وهو خيار افتراضي جيد لمعظم المحتوى.
- في المتصفح (Client-Side / CSR) — يرسل الخادم هيكلاً شبه فارغ ثم يملؤه JavaScript. وهذا الخيار محفوف بالمخاطر لـSEO؛ فتجنبه للمحتوى الرئيسي.
يستخدم App Router الحديث Server Components افتراضياً، ما يعني أن محتواك يصل تلقائياً إلى HTML؛ وهذه نقطة بداية ممتازة لـSEO.
قائمة التحقق البسيطة
- امنح كل صفحة عنواناً ووصفاً فريدين.
- اضبط عنوان URL أساسياً لكل صفحة.
- استخدم مكوّن
next/imageللصور؛ فهو يمنع قفز الصفحة عند تحميلها ويقلل حجمها. - استخدم
next/linkللروابط الداخلية؛ فهو ينشئ روابط حقيقية يستطيع Google تتبعها. - لا تضع محتواك الرئيسي خلف العرض من جهة العميل.
- أنشئ خريطة موقع وملف robots.txt؛ لدى Next.js طرق بسيطة قائمة على الملفات لكليهما. Evidence for this claim Next.js App Router supports special metadata files for sitemap and robots output. Scope: Next.js App Router file conventions. Confidence: high · Verified: Next.js: Metadata files
الفكرة التي يخطئ فيها الناس
«يتولى Next.js تحسين محركات البحث تلقائياً». لا يفعل ذلك، على الأقل في الأجزاء المهمة. يمنحك Next.js الآليات، مثل نظام البيانات الوصفية واصطلاحي sitemap وrobots ومكوّن الصور، لكن يظل عليك كتابة العناوين والأوصاف والروابط الأساسية بنفسك. Evidence for this claim Next.js provides metadata APIs, but developers supply page-specific metadata values. Scope: Next.js App Router metadata and generateMetadata APIs. Confidence: high · Verified: Next.js: Metadata and OG images تحتاج كل صفحة إلى قيمها الخاصة؛ ومن أكثر أسباب ضعف أداء بناء Next.js شيوعاً مشاركة جميع الصفحات عنواناً واحداً أو غياب الرابط الأساسي.
هل تريد النسخة الأعمق، بما فيها نظاما التوجيه وMetadata API وmetadataBase وإعداد صورة
LCP والأخطاء التي تعطّل الفهرسة بصمت؟ انتقل إلى تبويب Advanced.
الخلاصة — يحل Next.js أصعب مشكلات SEO في JavaScript افتراضياً عند استخدامه على نحو صحيح. يعتمد App Router على Server Components ويدعم SSG وSSR وISR، وكلها ترسل HTML معروضاً فلا يوجد تأخير لطابور العرض. اضبط البيانات الوصفية عبر Metadata API الأصلية (
metadata/generateMetadata) ولا تنسmetadataBaseكي لا تصبح الروابط الأساسية وصور OG نسبية. استخدمapp/sitemap.tsوapp/robots.ts، وابنِ المسارات الديناميكية مسبقاً بـgenerateStaticParams، واضبطpriorityلصورة LCP، وحافظ على الروابط كمراسيnext/linkحقيقية. يدعم Pages Router تحسين البحث أيضاً عبرnext/head. الأخطاء متوقعة، ومعظمها ليس خطأ Next.js بل خطأ التنفيذ.
موقع Next.js في الصورة
Next.js إطار مبني على React، لذا ينطبق عليه كل ما في SEO في JavaScript. وما يستحق دليلاً مستقلاً هو أنه يوفر حلولاً أصلية لمعظم مشكلات JS وSEO: العرض على الخادم، والتوليد الثابت، ونظام البيانات الوصفية، واصطلاحي sitemap وrobots. ليست الصعوبة في قدرة Google على قراءته، فهو يعرض JavaScript منذ سنوات، بل في اختيار نمط العرض الصحيح وربط أساسيات SEO. وهذه حالة متخصصة من SEO لنظام CMS بلا واجهة؛ فقرارات العرض في الواجهة الأمامية أهم بكثير من نظام CMS نفسه.
احفظ هذا الإطار: عبارة «هذا موقع Next.js» لا تخبرك بكيفية تقديم أي عنوان URL بعينه. يُضبط نمط العرض والتخزين المؤقت وحدود Server/Client Components لكل مسار، وأحياناً لكل مقطع. قد يجمع المشروع صفحة تسويق ثابتة وصفحة منتج SSR ولوحة Client Component. لا تعمم سلوك مسار واحد على التطبيق كله؛ اختبر عنوان URL المحدد.
نظاما توجيه وآليتان مختلفتان
لدى Next.js نظاما توجيه يتعاملان مع SEO بطرق مختلفة:
- Pages Router، وهو النموذج الأقدم: يجلب البيانات عبر
getStaticPropsأوgetServerSideProps، ويدير البيانات الوصفية بـ<Head>منnext/headأو حزمةnext-seo، ولا يدعم Server Components. - App Router، منذ v13 وهو النهج الحالي الموصى به: يستخدم React Server Components
افتراضياً، وMetadata API الأصلية (
metadataأوgenerateMetadata)، واصطلاحيapp/sitemap.tsوapp/robots.ts، وgenerateStaticParamsللمسارات الديناميكية. Evidence for this claim The App Router uses Server Components and supports generateStaticParams plus metadata file conventions. Scope: Current Next.js App Router behavior; route rendering can become dynamic based on APIs used. Confidence: high · Verified: Next.js: Server and Client Components Next.js: generateStaticParams
يمكن لكليهما تحقيق ترتيب جيد. يمنحك App Router نظام بيانات وصفية أنظف ومتكاملاً، من دون
التعامل المتكرر مع next/head، وServer Components جاهزة؛ لذلك أفضله للبناء الجديد. لكن
مقولة «App Router أو لا SEO» خرافة؛ فمواقع Pages Router كثيرة تحقق ترتيباً جيداً.
أنماط العرض وما يعنيه كل منها لـSEO
يعالج Google JavaScript في ثلاث مراحل: الزحف، ثم موجة عرض مؤجلة، ثم الفهرسة. “All pages with a 200 HTTP status code are sent to the rendering queue.” (الترجمة العربية) «تُرسل كل الصفحات التي ترجع رمز HTTP 200 إلى طابور العرض». الفكرة الأساسية في Next.js هي اختيار نمط يضع المحتوى في HTML قبل موجة العرض، فلا يبقى ما تنتظره. Evidence for this claim Google crawls, renders, and indexes JavaScript pages, and successful pages can enter the rendering queue. Scope: Google Search processing, not a promise that a URL will be indexed. Confidence: high · Verified: Google: JavaScript SEO basics
- Static Site Generation (SSG) — تُعرض الصفحات مسبقاً وقت البناء، فيتوفر HTML فوراً
بلا مخاطرة طابور العرض. يلائم المحتوى الذي لا يتغير كل دقيقة. يحدد
generateStaticParams()في App Router أوgetStaticPaths()في Pages Router المسارات الديناميكية التي تُبنى مسبقاً. - Incremental Static Regeneration (ISR) — صفحات ثابتة يعاد التحقق منها بعد مدة
(
export const revalidate = 3600). يحصل الزاحف على HTML ثابت وTTFB منخفض مع بقاء المحتوى حديثاً. لكنه يحمل فخاً: بعد انتهاء النافذة يحصل الطلب التالي، وربما Googlebot، على الصفحة القديمة، وتُقدّم النسخة الجديدة في الطلب الذي يليه. للبيانات شديدة التقلب، كالأسعار والمخزون، يكون SSR أكثر أماناً. - Server-Side Rendering (SSR) — يُعرض HTML لكل طلب. يحصل الزاحف على HTML كاملاً فوراً،
مقابل زمن خادم أعلى؛ لذا راقب TTFB وLCP. يؤدي
export const dynamic = 'force-dynamic'أو استخدام واجهات وقت الطلب، مثل ملفات تعريف الارتباط والرؤوس، إلى اختيار SSR للمسار. - React Server Components، وهي افتراضية في App Router: تُعرض على الخادم ويُرسل HTML
من دون JavaScript للمكوّن نفسه. يوجد المحتوى في الاستجابة الأولى بلا فجوة hydration،
وهذا أفضل افتراض لـSEO. تعيش التفاعلية في Client Components الموسومة بـ
'use client'. - Client-Side Rendering (CSR) — يحدث العرض كله في المتصفح. يستطيع Googlebot فهرسته
بعد موجة العرض، بوسيط يقارب 10 ثوانٍ بينما يمتد المئين التسعون إلى ساعات، وقد تحصل
زواحف أخرى، مثل Bingbot وروبوتات الذكاء الاصطناعي ومعاينات الشبكات الاجتماعية، على صفحة
فارغة. في App Router يكون CSR اختيارياً بـ
'use client'، وفي Pages Router تجنب جلب المحتوى الرئيسي داخلuseEffect. لا تستخدمه للمحتوى الذي تريد ترتيبه.
تذكّر دائماً أن «Googlebot يستطيع عرضه» لا تعني «ينبغي أن تجعله يعرضه». العرض مكلف ومؤجل وليس متاحاً لكل الزواحف.
Metadata API في App Router
تعمل Metadata API في Server Components فقط؛ تُحل البيانات الوصفية على الخادم قبل عرض
الصفحة فتصل إلى HTML الأولي. صدّر metadata من layout.js أو page.js:
export const metadata: Metadata = {
title: 'My Page',
description: 'Page description',
}وعندما تعتمد الوسوم على بيانات مجلوبة، استخدم generateMetadata():
export async function generateMetadata({ params }) {
const post = await getPost(params.slug)
return { title: post.title, description: post.description }
}الحقول المهمة لـSEO:
title— يدعم نصاً وقالباً ('%s | Brand') وقيمة افتراضية وتجاوزاً مطلقاً. اضبط القالب مرة في root layout لترثه عناوين الصفحات.descriptionو**alternates.canonical، وهي الطريقة الصحيحة لضبط الرابط الأساسي في App Router، وopenGraph** التي يجب أن تُحل صورها إلى عناوين مطلقة، و**twitter** المستخدم أيضاً في معاينات LinkedIn وSlack، و**robots** لتوجيهات index/follow وتوجيهات googleBot مثل max-snippet وmax-image-preview.metadataBase— مطلوب لحل الروابط الأساسية وصور OG بصورة صحيحة. نسيانه أكثر أخطاء بيانات Next.js الوصفية شيوعاً؛ إذ تتسرب عناوين نسبية إلى canonical وOpen Graph، فتعطّل المعاينات وتشوّش إشارات الرابط الأساسي.
مثال على قالب العنوان:
// app/layout.tsx
export const metadata: Metadata = {
metadataBase: new URL('https://example.com'),
title: { template: '%s | Brand Name', default: 'Brand Name' },
}
// app/blog/page.tsx
export const metadata: Metadata = { title: 'My Blog Post' }
// Output: <title>My Blog Post | Brand Name</title>فخّان. أولاً، تُدمج البيانات الوصفية سطحياً من layout إلى page؛ فكائن متداخل مثل
openGraph في مقطع ابن يستبدل كائن الأب كاملاً. لذلك يحذف
openGraph: { title: 'Home' } على مستوى الصفحة أي openGraph.images في layout بصمت.
ثانياً، تعمل metadata في Server Components فقط؛ وتصديرها من ملف 'use client'
لا يفعل شيئاً من دون تنبيه.
البيانات الوصفية المتدفقة. في الصفحات المعروضة ديناميكياً يستطيع
generateMetadata بث البيانات الوصفية بعد HTML الأولي. ينفذ Googlebot JavaScript ويفحص
DOM كاملاً، فيعمل التدفق معه. لكن Next.js يكتشف الروبوتات محدودة HTML، مثل Bingbot
وTwitterbot وSlackbot وfacebookexternalhit، ويرسل إليها البيانات الوصفية دفعة واحدة داخل
<head>. تقول وثائق Next.js: “streaming metadata is disabled for bots and crawlers that
expect metadata to be in the <head> tag.” (الترجمة العربية) «يُعطّل بث البيانات
الوصفية للروبوتات والزواحف التي تتوقع وجودها في وسم <head>». يحدث ذلك تلقائياً بلا
إعداد. أما الصفحات المعروضة مسبقاً فتُستكمل بياناتها الوصفية وقت البناء ولا يوجد بث أصلاً.
السلوك مرتبط بالإصدار، وهو حالي حتى Next.js 16.2.10؛ فأعد فحص وثائق generateMetadata
عند الترقية. وبسبب اختلاف مسارات التسليم، تحقق بطريقتين: طلب إنتاج مباشر (curl -I أو
عرض المصدر) وانتقال من جهة العميل إلى المسار نفسه، فقد يتغير head بينهما.
البيانات الوصفية عبر next/head في Pages Router
في Pages Router تعيش البيانات الوصفية داخل <Head> من next/head:
import Head from 'next/head'
export default function Page() {
return (
<>
<Head>
<title>My Page | Brand</title>
<meta name="description" content="Description" />
<link rel="canonical" href="https://example.com/my-page" />
</Head>
{/* page content */}
</>
)
}اضبط العنوان والوصف لكل صفحة، لا في _app.js وحده، وضع canonical لكل صفحة بما فيها
نسخ التقسيم إلى صفحات. توحّد حزمة next-seo ذلك عبر مكوّن <NextSeo> ومساعدات البيانات
المنظمة. ويعني الانتقال إلى App Router غالباً استبدال next/head وnext-seo بتصدير
metadata الأصلي.
هل تحتاج إلى حزمة next-seo؟ إنها إضافة خارجية وليست جزءاً من Next.js، وما زالت
تُصان بنشاط عند v7.2.0 وقت الكتابة وليست مؤرشفة. تحدد وثائقها موضعها بوضوح: للوسوم
الوصفية القياسية في App Router يوصي README باستخدام generateMetadata/metadata
المدمجين بدلاً من <NextSeo>، أما في Pages Router فيظل <NextSeo> طبقة مساعدة
مقبولة فوق next/head. وتبقى مكوّنات JSON-LD المساعدة، مثل ArticleJsonLd وFAQPageJsonLd
مع useAppDir، حالة استخدام في App Router تفضلها بعض الفرق على كتابة
<script type="application/ld+json"> يدوياً. الخلاصة: في بناء App Router جديد ابدأ
بـMetadata API الأصلية؛ الحزمة اختيارية وليست شرطاً، وهذا ما يقوله القائمون عليها.
خرائط الموقع
في App Router يمثل app/sitemap.ts اصطلاح ملف ينتج /sitemap.xml:
import type { MetadataRoute } from 'next'
export default function sitemap(): MetadataRoute.Sitemap {
return [
{ url: 'https://acme.com', lastModified: new Date(), priority: 1 },
{ url: 'https://acme.com/blog', lastModified: new Date(), priority: 0.8 },
]
}في المواقع الكبيرة يقسم generateSitemaps() الخريطة إلى ملفات عدة، إذ يحد Google كل
خريطة بـ50 000 عنوان URL، ويُقدّم كل ملف عند /.../sitemap/[id].xml. يدعم الناتج أيضاً
خرائط الصور والفيديو وalternates.languages الموطنة. وفي Pages Router استخدم
next-sitemap أو أنشئ pages/sitemap.xml.js عبر getServerSideProps.
robots.txt
ينشئ app/robots.ts ملف robots برمجياً:
export default function robots(): MetadataRoute.Robots {
return {
rules: [{ userAgent: '*', allow: '/', disallow: '/private/' }],
sitemap: 'https://acme.com/sitemap.xml',
}
}يدعم قواعد لكل user-agent وخرائط موقع متعددة. يستخدم Pages Router ملفاً ثابتاً هو
public/robots.txt. والقاعدة التي لا تحتمل الخطأ في النظامين: لا تحظر JavaScript أو
CSS أبداً؛ فلن يعرض Google الملفات المحظورة، وقد يؤدي ذلك في إطار JS إلى صفحة فارغة.
next/image ومؤشرات Core Web Vitals
يُعد next/image من أقوى أسباب استخدام الإطار لـSEO. فهو يحمّل صور ما تحت الجزء المرئي
كسولاً، ويتطلب width/height أو fill لحجز المساحة ومنع انزياح التخطيط / CLS،
ويقدم WebP/AVIF تلقائياً، وينشئ srcset صحيحاً من الخاصية sizes. أهم تحسين منفرد لـCWV
هو priority على صورة البطل أو الصورة أعلى الجزء المرئي، إذ يحمّلها مسبقاً لتحسين LCP:
<Image src="/hero.jpg" width={1200} height={630} priority alt="Hero" />نسيان priority لصورة LCP أكثر أخطاء CWV شيوعاً في Next.js، وهذه المشكلات واسعة الانتشار
في المواقع الفعلية؛ راجع بيانات Salt Agency في تبويب Stats. حقل alt مطلوب: فارغ للصور
الزخرفية ووصفي لصور المحتوى.
next/link والربط الداخلي
يعرض next/link مراسي <a href> قياسية في HTML، فيتبعها Google طبيعياً، ويضيف تنقلاً من
جهة العميل وجلباً مسبقاً في الخلفية للروابط الظاهرة في الإنتاج. القاعدة بسيطة: استخدم
next/link للروابط الداخلية، ولا تستبدله بمعالج onClick أو تنقل JavaScript لا ينتج
مرساة حقيقية؛ فتلك الروابط غير قابلة للزحف. استخدم prefetch={false} للروابط منخفضة
القيمة لتوفير النطاق عند الحاجة.
المسارات الديناميكية وgenerateStaticParams
يخبر generateStaticParams() إطار Next.js بالمسارات الديناميكية التي يعرضها مسبقاً وقت البناء:
// app/blog/[slug]/page.tsx
export async function generateStaticParams() {
const posts = await getPosts()
return posts.map((post) => ({ slug: post.slug }))
}الصفحات المبنية هكذا HTML ثابت بالكامل، وهو الأفضل لـSEO. من دونه تُعرض المسارات
الديناميكية عند الطلب عبر SSR افتراضياً، وهذا صالح لكنه يعيد زمن الخادم. ادمجه مع
revalidate وISR للمحتوى المتجدد، وتأكد من إدراج كل العناوين الديناميكية المهمة كي لا
ينتظر شيء طابور العرض.
البيانات المنظمة (JSON-LD)
لا تحتوي Metadata API حقلاً للبيانات المنظمة؛ بل تحقن JSON-LD كوسم <script> في
Server Component ليبقى في HTML المعروض على الخادم بلا كلفة على حزمة العميل:
const jsonLd = { '@context': 'https://schema.org', '@type': 'Article', /* … */ }
return <script type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />الأنواع المعتادة هي Article/BlogPosting وBreadcrumbList وProduct وFAQPage. تحقق منها باختبار النتائج المنسقة بعد أي تغيير في العرض.
أخطاء SEO الشائعة في Next.js
مستخلصة من عمليات تدقيق فعلية والأنماط السابقة:
- روابط canonical مفقودة أو نسبية، غالباً بسبب نسيان
metadataBase، ما يعطل أيضاً عناوين صور OG. - غياب
priorityعن صورة LCP، وهو أكبر إخفاق في CWV. - صفحات 404 ترجع
200؛ استخدمnotFound()المدمج لإرجاع الحالة الصحيحة، إذ تنتشر أخطاء 404 المرنة في مواقع Next.js. - تصدير
metadataمن Client Component؛ لا يفعل شيئاً بصمت لأنه خاص بـServer Components. - CSR للمحتوى الرئيسي؛ فجلب المحتوى الحرج في
useEffectيمنح الزواحف غير Google صفحات فارغة. - توجيه التجزئة (
#) بدلاً من History API؛ فلا يمكن زحف تلك العروض منفصلة. - عدم تصدير
generateStaticParams؛ فتُعرض المسارات عند الطلب بدلاً من بنائها مسبقاً. - استبدال
openGraphعبر وراثة layout؛ تستبدل المقاطع الأبناء الكائن ولا تدمجه. - حظر JS/CSS في robots.txt أو بسياسة Content Security Policy تمنع Chrome عديم الرأس لدى Googlebot من تحميل النصوص؛ اختبر ذلك عبر URL Inspection.
ملاحظات النشر
تطوّر Vercel إطار Next.js، والاستضافة لديها تمنح تكاملاً وثيقاً، مثل CDN طرفي للصفحات
الثابتة وISR وTTFB جيد، لكنها ليست مطلوبة. عرّف التحويلات الدائمة في redirects() داخل
next.config.js، فتُرجع 308 أو 301 مع permanent: true، واضبط رؤوس الأمان والتخزين عبر
headers()، واستخدم رأس X-Robots-Tag لقواعد noindex حسب المسار عندما يصعب استخدام
بيانات robots لكل صفحة.
ما الذي تفحصه وأين. لا تظهر حالة التخزين والرموز والتحويلات والبيانات المتدفقة كلها في الاختبار نفسه؛ فقد يبدو المسار سليماً في فحص ومعطلاً في آخر:
| الفحص | موضع الفحص | سبب اختلافه عما تراه معروضاً |
|---|---|---|
| عمر التخزين/إعادة التحقق | رؤوس استجابة طلب مباشر (curl -I) | قد يقدم ISR صفحة قديمة للطلب التالي مباشرة بعد انتهاء النافذة |
| حالة HTTP المباشرة | curl -I على عنوان الإنتاج لا الواجهة المعروضة | عرض «غير موجود» بلا notFound() يظل يرجع 200 |
| سلوك التحويل | السياق الفعلي الذي يشغله: redirect() في Server Action أو Route Handler مقابل onClick للعميل | تختلف الحالة ومسار الاستجابة بحسب سياق الاستدعاء لا الوجهة وحدها |
| البيانات الوصفية المتدفقة | طلب مباشر وانتقال عميل إلى المسار نفسه | قد يتلقى العميل العادي تدفقاً فيما تتلقى روبوتات HTML البيانات كاملة داخل رأس الصفحة |
| انتقالات جهة العميل | تنقل داخل التطبيق ثم افحص <head> ثانية | قد ينحرف مسار صحيح عند التحميل الأول بعد انتقال العميل |
لا يضمن الإطار أياً من ذلك؛ يمنحك Next.js آليات مثل redirects() وnotFound() وإعادة
التحقق والتدفق، لكن مفاتيح التخزين والإبطال وحالة المعاينة وإعداد النشر تظل مسؤوليتك،
ويجب اختبارها في الإنتاج لا محلياً فقط.
ملاحظة أخيرة بشأن العرض الديناميكي، أي تقديم HTML معروض مسبقاً للروبوتات وJavaScript للمستخدمين. أوقف Google التوصية به: “dynamic rendering was a workaround and not a long-term solution.” (الترجمة العربية) «كان العرض الديناميكي حلاً التفافياً لا حلاً طويل الأمد». لا تحتاجه في Next.js؛ إذ تضع SSR وSSG وISR وServer Components المحتوى أصلاً في HTML. اذكره لتتعرف إليه في التدقيق، ولا تبنِ عليه.
المسار السليم هو App Router مع Server Components وISR وMetadata API مع metadataBase،
وnext/image مع priority. اضبطها جيداً فتكون قد عالجت معظم SEO في Next.js.
ملخص الذكاء الاصطناعي
نسخة مكثفة من الشرح المتقدم:
- يحل Next.js معظم مشكلات JS وSEO افتراضياً إذا اخترت نمط العرض الصحيح وربطت الأساسيات. يمنحك الإطار البنية الأساسية ولا يكتب وسومك.
- نظاما توجيه: يستخدم App Router منذ v13، وهو الموصى به، Server Components
وMetadata API الأصلية؛ ويستخدم Pages Router
next/headوnext-seo. ويمكن لكليهما إنتاج صفحات صالحة للترتيب. - أنماط العرض: SSG وServer Components أفضل افتراض، لأن المحتوى في HTML بلا تأخير عرض. يمثل ISR حلاً وسطاً قوياً مع فخ النسخة القديمة في أول طلب بعد إعادة التحقق. استخدم SSR للبيانات المتقلبة. CSR خطر وقد يمنح الزواحف غير Google صفحة فارغة.
- Metadata API في App Router: تصدير
metadataأوgenerateMetadata()في Server Component فقط.metadataBaseمطلوب وإلا صارت canonicals وصور OG نسبية. يستبدلopenGraphفي المقطع الابن كائن الأب، ولا تفعل metadata في ملف'use client'شيئاً. - البيانات المتدفقة تعمل مع Google، ويرسل Next.js تلقائياً بيانات غير متدفقة داخل رأس الصفحة إلى الروبوتات محدودة HTML، مثل Bingbot وTwitterbot وSlackbot وfacebookexternalhit.
- اصطلاحات الملفات:
app/sitemap.tsمعgenerateSitemaps()لأكثر من 50 000 عنوان، وapp/robots.ts. لا تحظر.jsأو.cssأبداً. - يمنع
next/imageCLS ويقدم WebP/AVIF؛ اضبطpriorityلصورة LCP، وهو أهم مكسب CWV. ويعرضnext/linkمراسي<a href>حقيقية قابلة للزحف ويجلبها مسبقاً. - يبني
generateStaticParamsالمسارات الديناميكية مسبقاً؛ ومن دونه تُعرض عند الطلب. - يُحقن JSON-LD كوسم
<script>في Server Component؛ فلا حقل له في Metadata API. - حزمة
next-seoاختيارية وليست مطلوبة. إنها برمجية خارجية مصانة بنشاط عند v7.2.0 وغير مؤرشفة، وتوصي وثائقها بـgenerateMetadata/metadataالمدمجين لوسوم App Router. يظل<NextSeo>مفيداً أساساً في Pages Router أو لمكوّنات JSON-LD المساعدة. - يُضبط نمط العرض لكل مسار لا لكل مشروع؛ فلا تفترض سلوك عنوان من آخر. اختبر المسار المحدد بطلب مباشر وانتقال من جهة العميل.
- أبرز الأخطاء: غياب
metadataBaseوpriorityلصورة LCP، وإرجاع صفحة «غير موجودة» بالرمز200بدلاً منnotFound()، ووضعmetadataفي Client Component، واستخدام CSR للمحتوى الرئيسي. - أوقف Google التوصية بالعرض الديناميكي؛ لا تحتاجه لأن SSR وSSG وISR وServer Components تكفي.
الوثائق الرسمية
وثائق أولية من Next.js ومحركات البحث.
Next.js
- البيانات الوصفية وصور OG — نظام App Router و
metadataBaseوإنشاء صور OG. - مرجع generateMetadata —
metadataالثابتة مقابلgenerateMetadataوالتدفق وقائمة روبوتات HTML. - اصطلاح ملف sitemap.xml —
app/sitemap.tsوgenerateSitemaps()وخرائط الصور والفيديو واللغات. - اصطلاح ملف robots.txt —
app/robots.tsوقواعد user-agent والخرائط المتعددة. - تعلم SEO — مسار Next.js التعليمي التمهيدي، وبعضه يسبق App Router.
- فهم أساسيات SEO في JavaScript — مسار الزحف ثم العرض ثم الفهرسة، وطابور الحالة 200، وصفحات الخطأ المرنة، والروابط الأساسية وHistory API.
- العرض الديناميكي، حل أُوقف التوصية به — سبب إيقاف التوصية وبدائل SSR والعرض الثابت وhydration.
- دليل معمق لعمل بحث Google — موضع العرض ضمن الزحف والفهرسة والتقديم.
Bing / Microsoft
- IndexNow / indexnow.org — بروتوكول الدفع الذي تربطه بحدث نشر أو إعادة تحقق في Next.js.
اقتباسات من المصادر
تصريحات موثقة من Google وNext.js وممثلي Google. يقفز كل رابط مباشرة إلى المقطع المقتبس.
Google — كيفية معالجة صفحات JavaScript
- “All pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page.” (الترجمة العربية) «تُرسل كل الصفحات التي ترجع رمز HTTP 200 إلى طابور العرض، سواء احتوت الصفحة على JavaScript أم لا». — وثائق Google Search Central. انتقل إلى الاقتباس
Google — أُوقف التوصية بالعرض الديناميكي
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” (الترجمة العربية) «كان العرض الديناميكي حلاً التفافياً لا حلاً طويل الأمد لمشكلات المحتوى الذي ينشئه JavaScript في محركات البحث». — وثائق Google Search Central. انتقل إلى الاقتباس
- ““…creates additional complexities and resource requirements.”” (الترجمة العربية) «… يفرض تعقيدات إضافية ويتطلب موارد إضافية». — وثائق Google Search Central. انتقل إلى الاقتباس
Next.js — تدفق البيانات الوصفية وروبوتات HTML المحدودة
- “Streaming metadata is disabled for bots and crawlers that expect metadata to be in the
<head>tag (e.g. Twitterbot, Slackbot, Bingbot).” (الترجمة العربية) «يُعطّل تدفق البيانات الوصفية للروبوتات والزواحف التي تتوقع وجودها في وسم<head>، مثل Twitterbot وSlackbot وBingbot». — وثائق Next.js،generateMetadata. انتقل إلى الاقتباس
جون مولر، Google (عبر تغطية Search Engine Journal)
- عن تنامي دور JavaScript في SEO: “You’re going to run into significantly more JavaScript over the next years than in the 2-ish decades in SEO before. If you’re keen on technical SEO, then past HTML you’re going to need to understand JS more and more.” (الترجمة العربية) «ستواجه JavaScript أكثر بكثير في الأعوام المقبلة مقارنة بنحو عقدين سابقين من SEO. وإذا كنت مهتماً بـSEO التقني، فعليك بعد HTML أن تفهم JS أكثر فأكثر». اقرأ التغطية
قائمة تحقق SEO في Next.js
مراجعة سريعة للتأكد من أن موقع Next.js قابل للزحف والفهرسة وسريع:
- يظهر المحتوى الرئيسي في HTML عند الطلب الأول عبر Server Components أو SSG أو SSR أو ISR، لا بعد JavaScript من جهة العميل فقط.
- لا تعتمد أي صفحة مهمة على CSR لمحتواها الرئيسي.
- لكل صفحة عنوان ووصف فريدان؛ استخدم
templateللعنوان في root layout. - ضُبط
metadataBaseفي root layout كي تكون canonicals وصور OG مطلقة. - ضُبط canonical لكل صفحة عبر
alternates.canonicalفي App Router أو<link rel="canonical">في Pages Router، لا رابط الصفحة الرئيسية نفسه للجميع. - تُصدّر
metadataمن Server Components فقط، لا من ملف'use client'. - يغطي
generateStaticParamsكل المسارات الديناميكية المهمة. - ينتج
app/sitemap.tsأوnext-sitemapخريطة حديثة، ويقسمgenerateSitemaps()المواقع التي تتجاوز 50 000 عنوان URL. - يوجد
app/robots.tsأوpublic/robots.txtولا يحظر.jsأو.css. - تستخدم الصور
next/imageمعwidth/heightأوfill، ولصورة LCP خاصيةpriority، ولكل الصورalt. - تستخدم الروابط الداخلية
next/linkكمرساة<a href>حقيقية، بلا تنقلonClickفقط. - تستدعي عروض 404 الدالة
notFound()وتعيد404حقيقياً، لا 404 مرنة. - يُحقن JSON-LD في
<head>أو body داخل Server Component ويجتاز اختبار النتائج المنسقة. - تعيش التحويلات الدائمة في
redirects()داخلnext.config.jsمع 308 أوpermanent.
النماذج الذهنية
1. نمط العرض هو المنتج. قبل تصحيح أي شيء في موقع Next.js أجب: كيف يُعرض هذا المسار؟ تضع Server Components وSSG وSSR وISR المحتوى في HTML وهي منخفضة المخاطر، بينما CSR هو الخيار الخطر. تعود معظم مشكلات SEO في Next.js إلى هذا السؤال.
2. يمنحك الإطار البنية لا المحتوى. يوفر Next.js Metadata API واصطلاحي sitemap/robots ومكوّن Image، لكنه لا يكتب عناوينك أو أوصافك أو canonicals أو بياناتك المنظمة. خرافة «يتولى Next.js SEO تلقائياً» هي الأغلى هنا.
3. مصدر حقيقة واحد لعناوين URL.
اضبط metadataBase مرة وابنِ منه canonicals وصور OG وإدخالات الخريطة، بعناوين مطلقة لا
نسبية. يزيل عنوان أساسي واحد فئة أخطاء canonical النسبي وصور OG المكسورة.
4. Server Components أولاً، وClient Components عند الحاجة فقط.
اعتمد Server Components كي يصل المحتوى والبيانات الوصفية إلى HTML، واستخدم 'use client'
للتفاعل فقط. تذكّر أن metadata لا يمكن أن تأتي من Client Component.
5. قاعدة قرار العرض. المحتوى الثابت غالباً، مثل المدونات والوثائق والتسويق، ← SSG أو ISR بمؤقت. البيانات الدائمة الحداثة والمتقلبة، كالأسعار والمخزون، ← SSR. ما يتغير كل ساعة أو يوم مع رغبة في سرعة الثابت ← ISR مع الانتباه لفخ أول طلب قديم. التفاعلي خلف تسجيل دخول وغير مفهرس ← CSR مناسب. المحتوى العام الذي تريد ترتيبه ← لا تستخدم CSR.
SEO في Next.js — ورقة مرجعية
أنماط العرض
| النمط | أين يُبنى HTML | SEO | الأنسب لـ | انتبه إلى |
|---|---|---|---|---|
| SSG | وقت البناء ← ثابت | ✅ الأفضل | المحتوى شبه الثابت | يبقى قديماً حتى إعادة البناء |
| Server Components | الخادم، افتراض App Router | ✅ الأفضل | معظم المحتوى | يحتاج التفاعل إلى Client Components |
| ISR | ثابت + تجديد مؤقت | ✅ جيد | محتوى ساعي/يومي | أول طلب بعد التحقق يحصل على نسخة قديمة |
| SSR | الخادم لكل طلب | ✅ جيد | البيانات الدائمة الحداثة | TTFB وتكلفة بنية أعلى |
| CSR | المتصفح | ⚠️ خطر | لوحات مسجلة الدخول | صفحة فارغة للزواحف غير Google |
App Router مقابل Pages Router
| الميزة | App Router | Pages Router |
|---|---|---|
| البيانات الوصفية | metadata / generateMetadata | next/head + next-seo |
| Server Components | افتراضية | غير متاحة |
| تدفق بيانات واعٍ بالروبوت | نعم | لا |
| خريطة الموقع | app/sitemap.ts | next-sitemap / يدوياً |
| Robots | app/robots.ts | public/robots.txt |
| Canonical | alternates.canonical | <link rel="canonical"> داخل <Head> |
| جلب البيانات | Server Components غير متزامنة | getStaticProps / getServerSideProps |
قواعد سريعة
- اضبط
metadataBaseوإلا أصبحت canonicals وصور OG نسبية. - تعمل
metadataفي Server Component فقط؛ لا يفعل تصدير'use client'شيئاً. - يستبدل
openGraphفي المقطع الابن كائن الأب ولا يدمجه. priorityلصورة LCP هو أهم مكسب CWV.- الروابط الداخلية =
next/linkكمرساة<a href>حقيقية؛ لا تنقل بـonClickفقط. - 404 ← استدعِ
notFound()لإرجاع404حقيقي لا مرن. - لا تحظر أبداً
.jsأو.css. - البيانات المتدفقة ← تُرسل دفعة واحدة داخل رأس الصفحة إلى Bingbot وTwitterbot وSlackbot وfacebookexternalhit.
- العرض الديناميكي: أُوقف التوصية به؛ استخدم SSR أو SSG أو ISR أو Server Components.
فحوص سريعة لبناء Next.js
بضعة فحوص من سطر الأوامر قبل استخدام زاحف كامل.
هل محتواك في HTML الخام أم لا يظهر إلا بعد تشغيل JS؟
macOS / Linux:
# Raw HTML as the server sends it — the "first fetch", before any client JS
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/page/ -o raw.html
# Is your headline actually in the raw HTML? (empty result = CSR / JS-dependent)
grep -o "Your headline text" raw.html
# Did metadataBase do its job? Canonical and OG URLs should be absolute, not relative
grep -iE 'rel="canonical"|og:(url|image)' raw.htmlWindows (PowerShell):
$ua = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Invoke-WebRequest -Uri "https://example.com/page/" -UserAgent $ua -OutFile raw.html
Select-String -Path raw.html -Pattern "Your headline text"
Select-String -Path raw.html -Pattern 'rel="canonical"','og:url','og:image'إذا غاب العنوان عن raw.html لكنه ظهر في المتصفح، فالمسار معروض من جهة العميل. وإذا
خرجت canonicals أو عناوين صور OG نسبية فقد نسيت metadataBase.
تأكد من عدم حظر JS/CSS، بما فيه مجلد Next.js المسمى _next
macOS / Linux:
curl -sL https://example.com/robots.txt | \
grep -iE "disallow.*\.(js|css)|Disallow:\s*/_next"Windows (PowerShell):
(Invoke-WebRequest "https://example.com/robots.txt").Content |
Select-String -Pattern "Disallow.*\.(js|css)","Disallow:\s*/_next"أي تطابق هنا يكاد يكون خطأ دائماً؛ فلن يعرض Google الملفات المحظورة. لا يستطيع curl
العادي تشغيل JavaScript، لذا استخدم في URL Inspection خيار «عرض الصفحة التي جرى الزحف
إليها ← HTML المعروض» لفحص DOM المعروض.
أدوات تدقيق موقع Next.js
- URL Inspection في Google Search Console — مصدر الحقيقة. شغّل اختباراً مباشراً
ثم اعرض HTML المعروض ولقطة الشاشة وموارد الصفحة لمعرفة ما حُمّل وما حُظر،
واكتشاف فجوات CSR وموارد
_nextالمحظورة. - Rich Results Test — تأكد من وصول JSON-LD إلى الناتج المعروض بعد أي تغيير.
- Lighthouse / Chrome DevTools — قِس LCP وCLS وINP وتحقق من التحميل المسبق لصورة البطل بـ
priority. - Ahrefs Site Audit — يزحف مع عرض JavaScript ويكشف canonicals المفقودة أو النسبية والبيانات المكسورة وسلاسل التحويل ومشكلات القابلية للفهرسة.
- Screaming Frog SEO Spider — ازحف مع تشغيل عرض JS وإيقافه لمقارنة HTML الخام والمعروض، وابنِ مقارنات قبل الترحيل وبعده.
- Bing Webmaster Tools — فحص عنوان URL لدى Bing وموضع ظهور إرسالات IndexNow.
أخطاء ينبغي تجنبها في Next.js
أنماط محددة تعطّل SEO بصمت في أبنية Next.js الفعلية. امنعها قبل الشحن بدلاً من تصحيحها بعد انخفاض الزيارات.
الشحن من دون metadataBase في root layout
سبب الخطأ: من دون metadataBase تُحل alternates.canonical وopenGraph.images إلى
مسارات نسبية لا عناوين URL مطلقة. قد يشوّش canonical النسبي إشارات التوحيد، وتكسر صور OG
النسبية معاينات الروابط في التطبيقات الاجتماعية والمراسلة.
البديل: اضبط metadataBase: new URL('https://example.com') مرة في app/layout.tsx
ودع الصفحات ترثه. افحصه بالأمر grep -iE 'rel="canonical"|og:(url|image)' على HTML خام؛
يجب أن تبدأ العناوين بـhttps://.
الكتابة فوق openGraph في layout من مقطع ابن
سبب الخطأ: تُدمج metadata سطحياً من layout إلى page. لا يندمج
openGraph: { title: 'Home' } على مستوى الصفحة مع openGraph.images في layout؛ بل
يستبدل الكائن كله ويحذف الصور بصمت.
البديل: كرر كائن openGraph كاملاً، بما فيه الصور، في كل مستوى يتجاوزه، أو تجاوز
حقول metadata العليا التي تحتاجها فقط واترك openGraph كما هو حين تكفي قيمة layout.
تصدير metadata من Client Component
سبب الخطأ: Metadata API خاصة بـServer Components. أضف 'use client' إلى ملف يصدر
metadata ولن يفعل التصدير شيئاً؛ لا خطأ ولا تحذير، بل صفحة بلا عنوان أو وصف.
البديل: احتفظ بتصدير metadata أو generateMetadata في ملف Server Component عادي،
مثل page.tsx أو layout.tsx بلا 'use client'. ضع تفاعل العميل في مكوّن ابن منفصل
واستورده، ولا تضف 'use client' إلى الملف الذي يملك تصدير metadata.
جلب المحتوى الرئيسي في useEffect أو الاعتماد على CSR كاملاً
سبب الخطأ: لا يوجد المحتوى المعروض في المتصفح فقط في HTML الأولي. سيعرضه Google لاحقاً، لكن وسيط التأخير حقيقي ويمتد المئين التسعون إلى ساعات. وغالباً لا تعرض زواحف غير Google، مثل Bing ومعاينات الشبكات ومعظم زواحف الذكاء الاصطناعي، JavaScript فتشاهد صفحة فارغة.
البديل: اعتمد Server Components أو SSG أو ISR أو SSR لكل ما تريد فهرسته. احتفظ
بـ'use client' وجلب useEffect لواجهة تفاعلية لا تحتاج إلى الزحف، كمرشح لا متن المقال.
إرجاع 200 لعرض «غير موجود»
سبب الخطأ: عرض رسالة «غير موجود» بلا استدعاء notFound() يرجع حالة 200 عادية. هذه
404 مرنة؛ قد يفهرس Google الصفحة الفارغة بدلاً من إدراك غيابها، وهي من أكثر مشكلات SEO
شيوعاً في مواقع Next.js الفعلية.
البديل: استدعِ notFound() المدمجة ليعيد المسار 404 حقيقياً. تحقق بـcurl -I على
عنوان مفقود معروف وافحص الرمز مباشرة، لا ما يظهر في المتصفح فقط.
تجاوز generateStaticParams في المسارات الديناميكية المهمة
سبب الخطأ: من دونها تعود المسارات الديناميكية إلى العرض عند الطلب عبر SSR. يظل ذلك صالحاً لـSEO لكنه يضيف زمن الخادم إلى كل طلب أول للعنوان، بما فيه طلب Googlebot.
البديل: عدّد العناوين المهمة، كصفحات المنتجات والمقالات والفئات، داخل
generateStaticParams() كي تُبنى مسبقاً، واقرنها بـrevalidate وISR للمحتوى المتغير بعد النشر.
اختبر نفسك: SEO في Next.js
خمسة أسئلة سريعة عن جعل موقع Next.js قابلاً للزحف والفهرسة وسريعاً. اختر إجابة لكل سؤال ثم تحقق.
موارد تستحق وقتك
كتاباتي ذات الصلة
- SEO في JavaScript: دليل شامل — دليلي الكامل إلى العرض وتكافؤ DOM والروابط الأساسية في JS وخرائط الموقع ومفاضلات أنماط العرض التي يقوم عليها Next.js. يضيف هذا الدليل طبقة خاصة بالإطار.
- دليل المبتدئين إلى SEO التقني — موضع العرض والزحف في الصورة الكبرى.
محاضراتي
- JavaScript SEO — Ungagged 2019 على SlideShare — شرح لكيف تفصل الأطر الواجهة الأمامية عن الخلفية وكيف يعرض Googlebot. تنبيه دائم: توصية العرض الديناميكي في العرض قديمة؛ أوقف Google التوصية بها.
من أنحاء المجال
- البيانات الوصفية وصور OG من وثائق Next.js — نظام App Router و
metadataBaseوإنشاء صور OG. - مرجع generateMetadata من وثائق Next.js — البيانات الثابتة والديناميكية وسلوك الروبوتات المحدودة والتدفق.
- اصطلاح ملف sitemap.xml من وثائق Next.js —
app/sitemap.tsوgenerateSitemaps()وخرائط اللغات والصور. - مشكلات SEO الشائعة في مواقع Next.js من Salt Agency — دراسة تدقيق 50 موقعاً ببيانات عن صفحات الخطأ المرنة وإخفاقات LCP.
- كيف يعالج Google JavaScript خلال الفهرسة من Vercel — بيانات زمن العرض من إشارات خادم nextjs.org.
- دليل SEO الكامل في Next.js من Strapi — شرح لأنماط العرض والبيانات الوصفية والمنظمة.
- App Router مقابل Pages Router لـSEO من Wisp — مقارنة مركزة من زاوية SEO.
- r/TechSEO — مجتمع تصحيح مشكلات العرض والفهرسة.
إحصاءات تستحق الاستشهاد
- يكون زمن العرض سريعاً عادةً وبطيئاً جداً أحياناً. وجد تحليل Vercel لأكثر من 37 000 زوج من إشارات الخادم على nextjs.org وسيط عرض يقارب 10 ثوانٍ، لكن المئين التسعين يقارب 3 ساعات والمئين 99 يقارب 18 ساعة؛ وهذا سبب عدم ترك المحتوى الرئيسي ينتظر طابور العرض. المصدر
- تنتشر مشكلات CWV و404 المرنة في مواقع Next.js الفعلية. وجد تدقيق Salt Agency لـ50
موقع Next.js أن 41 من 50 تعيد 404 مرنة، أي عرض 404 مع حالة
200، وأن 3 من 50 فقط تجتاز حدود LCP. لا تفيد مزايا الإطار إلا عند استخدامnext/imageمعpriorityوإرجاع رموز حالة حقيقية. المصدر
سجل التغييرات
تم التحديث في 13 أغسطس 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.
تم التحديث في 10 أغسطس 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.
تم التحديث في 18 يوليو 2026.
ملخص تحريري وتفاصيل التغيير المسجلة.تفاصيل التغيير
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
-
تفاصيل التغيير متاحة حاليًا باللغة الإنجليزية.
المقارنة الكاملة غير متاحة — لم تُؤرشف لقطة سابقة لهذه المراجعة.