اكتشف كيفية الاستفادة من دوال الحافة الأمامية للتوجيه الجغرافي الفعال. يغطي هذا الدليل الشامل توزيع الطلبات بناءً على الموقع لتحسين الأداء والامتثال لبيانات وتوطين المحتوى على نطاق عالمي.
التوجيه الجغرافي باستخدام دوال الحافة الأمامية: دليل لتوزيع الطلبات بناءً على الموقع
في عالم اليوم المترابط، لم يعد بناء التطبيقات لجمهور عالمي خيارًا—بل أصبح ضرورة. ومع ذلك، يمثل قاعدة المستخدمين العالمية مجموعة فريدة من التحديات: كيف تقدم المحتوى بأقل زمن استجابة لمستخدم في طوكيو وآخر في برلين؟ كيف تمتثل لقوانين خصوصية البيانات الإقليمية مثل GDPR في أوروبا؟ كيف تقدم محتوى مترجماً، مثل العملة واللغة، يبدو أصليًا لكل مستخدم؟ تكمن الإجابة على حافة الشبكة.
مرحبًا بكم في عالم التوجيه الجغرافي باستخدام دوال الحافة الأمامية. يجمع هذا النموذج القوي بين التنفيذ بزمن استجابة منخفض لدوال الحافة وذكاء المنطق القائم على الموقع لإنشاء تجارب مستخدم أسرع وأكثر امتثالًا وشخصية للغاية. من خلال اعتراض الطلبات على حافة الشبكة—الأقرب فعليًا للمستخدم—يمكن للمطورين اتخاذ قرارات توجيه ديناميكية قبل أن يصل الطلب إلى خادم أصلي مركزي.
سيرشدك هذا الدليل الشامل خلال كل ما تحتاج لمعرفته حول التوجيه الجغرافي على الحافة. سوف نستكشف ماهيته، ولماذا يغير قواعد اللعبة في تطوير الويب الحديث، وكيف يمكنك تنفيذه. سواء كنت مهندسًا معماريًا تصمم نظامًا عالميًا، أو مطورًا يسعى لتحسين الأداء، أو مدير منتج يهدف إلى تخصيص أفضل، سيوفر لك هذا المقال الرؤى والمعرفة العملية لإتقان توزيع الطلبات بناءً على الموقع.
ما هو التوجيه الجغرافي؟
في جوهره، التوجيه الجغرافي (أو geo-routing) هو ممارسة توجيه حركة مرور الشبكة إلى وجهات مختلفة بناءً على الموقع الجغرافي للمستخدم الطالب. إنه مثل وحدة تحكم ذكية في حركة المرور على الإنترنت، تضمن إرسال طلب كل مستخدم إلى الخادم أو الخدمة الأنسب لتلبيته.
النهج التقليدية مقابل ثورة الحافة
تاريخيًا، كان يتم التعامل مع التوجيه الجغرافي بشكل أساسي على مستوى نظام أسماء النطاقات (DNS). كانت تقنية تسمى GeoDNS تقوم بحل اسم النطاق إلى عناوين IP مختلفة اعتمادًا على مكان نشوء استعلام DNS. على سبيل المثال، يحصل مستخدم في آسيا على عنوان IP لخادم في سنغافورة، بينما يتم توجيه مستخدم في أوروبا إلى خادم في فرانكفورت.
على الرغم من فعاليته في توجيه حركة المرور إلى مراكز بيانات إقليمية مختلفة، إلا أن التوجيه القائم على DNS له قيود:
- نقص الدقة: يعمل DNS على مستوى عالٍ. لا يمكنه فحص رؤوس الطلبات الفردية أو اتخاذ قرارات بناءً على أي شيء آخر غير مصدر استعلام DNS.
- تأخيرات التخزين المؤقت: يتم تخزين سجلات DNS مؤقتًا بشكل كبير عبر الإنترنت. يمكن أن تستغرق التغييرات دقائق أو حتى ساعات لتنتشر عالميًا، مما يجعلها غير مناسبة للتوجيه الديناميكي في الوقت الفعلي.
- عدم الدقة: يعتمد الموقع على محلل DNS الخاص بالمستخدم، والذي قد لا يعكس بدقة الموقع الفعلي للمستخدم (على سبيل المثال، استخدام DNS عام مثل 8.8.8.8 الخاص بـ Google).
دوال الحافة تُحدث ثورة في هذه العملية. بدلاً من التوجيه على مستوى DNS، يتم تنفيذ المنطق على كل طلب HTTP على حدة في نقطة وجود (PoP) لشبكة توصيل المحتوى (CDN). يوفر هذا نهجًا أكثر قوة ومرونة، مما يسمح باتخاذ قرارات في الوقت الفعلي لكل طلب بناءً على بيانات موقع دقيقة ومقدمة من المزود.
قوة الحافة: لماذا تعد دوال الحافة الأداة المثالية
لفهم سبب فعالية دوال الحافة، يجب عليك أولاً فهم "الحافة". الحافة هي شبكة عالمية من الخوادم الموضوعة بشكل استراتيجي في مراكز البيانات في جميع أنحاء العالم. عندما يزور مستخدم موقعك، يتم التعامل مع طلبه من قبل الخادم الأقرب إليه فعليًا، وليس خادمًا مركزيًا بعيدًا.
دوال الحافة هي قطع صغيرة من التعليمات البرمجية بدون خادم (غالبًا JavaScript/TypeScript) تعمل على هذه الشبكة. إليك لماذا هي الأداة المثالية للتوجيه الجغرافي:
1. زمن استجابة منخفض للغاية
الفيزياء هي عنق الزجاجة النهائي في أداء الويب. الوقت الذي يستغرقه انتقال البيانات عبر القارات كبير. من خلال تنفيذ منطق التوجيه في أقرب عقدة حافة، يتم اتخاذ القرار في أجزاء من الثانية. هذا يعني أنه يمكنك إعادة توجيه مستخدم، أو إعادة كتابة طلب إلى خلفية إقليمية، أو تقديم محتوى مترجم بشكل فوري تقريبًا، دون عقوبة الذهاب والإياب إلى الخادم الأصلي أولاً.
2. تحكم دقيق لكل طلب
على عكس DNS، يمكن لدالة الحافة فحص طلب HTTP الوارد بالكامل. وهذا يشمل الرؤوس، وملفات تعريف الارتباط، ومعلمات الاستعلام، والمزيد. كما تقوم منصات الحافة الحديثة بإدخال بيانات جغرافية موثوقة في الطلب، مثل بلد المستخدم ومنطقته ومدينته. وهذا يسمح بقواعد دقيقة للغاية، مثل توجيه المستخدمين من مدينة معينة إلى ميزة تجريبية أو حظر حركة المرور من منطقة خاضعة للعقوبات.
3. تقليل الحمل على الخادم الأصلي والتكلفة
من خلال التعامل مع منطق التوجيه على الحافة، فإنك تخفف عبئًا كبيرًا عن خوادم التطبيق الرئيسية. إذا كان من الممكن خدمة طلب مباشرة من ذاكرة التخزين المؤقت للحافة، أو إعادة توجيهه، أو حظره عند الحافة، فلن يحتاج أبدًا إلى استهلاك موارد الحوسبة المكلفة في الخادم الأصلي. وهذا يؤدي إلى بنية أكثر مرونة وقابلية للتوسع وفعالية من حيث التكلفة.
4. تكامل سلس مع الأطر الحديثة
قامت منصات مثل Vercel و Netlify و Cloudflare بدمج دوال الحافة بإحكام في تدفقات عمل التطوير الخاصة بها. مع أطر عمل مثل Next.js أو Nuxt أو SvelteKit، يمكن أن يكون تنفيذ منطق الحافة بسيطًا مثل إضافة ملف `middleware.ts` إلى مشروعك، مما يجعله متاحًا لمطوري الواجهة الأمامية دون خبرة عميقة في DevOps.
كيف يعمل التوجيه الجغرافي مع دوال الحافة: تفصيل خطوة بخطوة
دعنا نتتبع رحلة طلب المستخدم لفهم آليات التوجيه الجغرافي القائم على الحافة.
- يبدأ المستخدم الطلب: يقوم مستخدم في لندن، المملكة المتحدة، بكتابة عنوان URL لموقعك في متصفحه.
- يصل الطلب إلى أقرب عقدة حافة: لا يسافر الطلب على طول الطريق إلى خادم في الولايات المتحدة. بدلاً من ذلك، يتم اعتراضه من قبل أقرب نقطة وجود (PoP)، على الأرجح في لندن.
- يتم استدعاء دالة الحافة: تكتشف منصة الحافة أن لديك دالة حافة مهيأة لهذا المسار. يتم تنفيذ كود الدالة على الفور.
- يتم الوصول إلى بيانات الموقع: توفر المنصة تلقائيًا للدالة بيانات موقع المستخدم، عادةً من خلال رؤوس طلب خاصة (مثل `x-vercel-ip-country: 'GB'`, `cf-ipcountry: 'GB'`) أو كائن `request.geo`.
- يتم تطبيق منطق التوجيه: يقوم الكود الخاص بك الآن بتشغيل منطقه. يتحقق من رمز البلد. على سبيل المثال:
if (country === 'GB') { ... }
- يتم اتخاذ إجراء: بناءً على المنطق، يمكن للدالة تنفيذ عدة إجراءات:
- إعادة الكتابة إلى خلفية إقليمية: يمكن للدالة إعادة توجيه الطلب بصمت إلى خادم مختلف، مثل `https://api.eu.your-service.com`، دون تغيير عنوان URL في متصفح المستخدم. هذا مثالي للامتثال لإقامة البيانات.
- إعادة التوجيه إلى عنوان URL مترجم: يمكن للدالة إرجاع استجابة 307 (إعادة توجيه مؤقت) أو 308 (إعادة توجيه دائم)، وإرسال المستخدم إلى نسخة مترجمة من الموقع، مثل `https://your-site.co.uk`.
- تعديل الاستجابة: يمكن للدالة جلب المحتوى الأصلي من المصدر، ثم تعديله بسرعة لإدخال محتوى أو أسعار أو سلاسل لغوية مترجمة قبل إرسالها إلى المستخدم.
- حظر الطلب: إذا كان المستخدم من منطقة محظورة، يمكن للدالة إرجاع استجابة 403 (محظور)، مما يمنع الوصول تمامًا.
- الخدمة من ذاكرة التخزين المؤقت: إذا كانت نسخة مترجمة من الصفحة موجودة بالفعل في ذاكرة التخزين المؤقت للحافة، فيمكن خدمتها مباشرة، مما يوفر أسرع استجابة ممكنة.
تحدث هذه العملية برمتها بشفافية للمستخدم وفي جزء من الثانية، مما يؤدي إلى تجربة سلسة ومحسنة.
حالات الاستخدام العملي والأمثلة الدولية
تتضح القوة الحقيقية للتوجيه الجغرافي في تطبيقاته الواقعية. دعنا نستكشف بعض حالات الاستخدام الأكثر شيوعًا وتأثيرًا للشركات العالمية.
دراسة الحالة 1: توطين التجارة الإلكترونية
التحدي: يريد بائع تجزئة عالمي عبر الإنترنت توفير تجربة تسوق مترجمة. يتضمن ذلك عرض الأسعار بالعملة المحلية، وعرض المنتجات ذات الصلة، واستخدام اللغة الصحيحة.
حل الحافة:
- تقوم دالة الحافة بفحص خاصية `geo.country` للطلب الوارد.
- إذا كان البلد هو 'JP' (اليابان)، فإنها تعيد توجيه المستخدم من `mystore.com` إلى `mystore.com/jp`.
- يتم عرض صفحة `/jp` من جانب الخادم بأسعار بالين الياباني (¥) ومحتوى باللغة اليابانية.
- إذا كان البلد هو 'DE' (ألمانيا)، تقوم الدالة بإعادة كتابة الطلب إلى نسخة من الصفحة تجلب بيانات المنتج من قاعدة بيانات مخزون أوروبية وتعرض الأسعار باليورو (€). يحدث هذا دون تغيير مرئي في عنوان URL، مما يوفر تجربة سلسة.
دراسة الحالة 2: سيادة البيانات والامتثال لـ GDPR
التحدي: تقدم شركة SaaS خدمات على مستوى العالم ولكن يجب أن تمتثل للنظام الأوروبي العام لحماية البيانات (GDPR)، الذي لديه قواعد صارمة حول مكان تخزين ومعالجة بيانات مواطني الاتحاد الأوروبي.
حل الحافة:
- تقوم دالة الحافة بالتحقق من `geo.country` لكل طلب API.
- يتم الاحتفاظ بقائمة بدول الاتحاد الأوروبي: `['FR', 'DE', 'ES', 'IE', ...]`.
- إذا كان بلد المستخدم في قائمة الاتحاد الأوروبي، تقوم الدالة داخليًا بإعادة كتابة عنوان URL للطلب من `api.mysaas.com` إلى `api.eu.mysaas.com`.
- يتم استضافة نقطة النهاية `api.eu.mysaas.com` على خوادم تقع فعليًا داخل الاتحاد الأوروبي (على سبيل المثال، في فرانكفورت أو دبلن).
- يتم توجيه الطلبات من جميع المناطق الأخرى (مثل 'US', 'CA', 'AU') إلى خلفية للأغراض العامة مستضافة في الولايات المتحدة.
دراسة الحالة 3: تحسين الأداء للألعاب عبر الإنترنت
التحدي: يحتاج مطور ألعاب متعددة اللاعبين عبر الإنترنت إلى توصيل اللاعبين بخادم اللعبة بأقل زمن استجابة ممكن (ping) لضمان اللعب العادل والسريع الاستجابة.
حل الحافة:
- عندما يبدأ عميل اللعبة، فإنه يقدم طلب "matchmaking" إلى نقطة نهاية API عالمية.
- تقوم دالة الحافة باعتراض هذا الطلب. وتحدد موقع المستخدم (`geo.country` و `geo.region`).
- تحتفظ الدالة بخريطة للمناطق الجغرافية وعناوين IP لأقرب خوادم ألعاب: `{'us-east': '1.2.3.4', 'eu-west': '5.6.7.8', 'ap-southeast': '9.10.11.12'}`.
- تستجيب الدالة لطلب API بعنوان IP لخادم اللعبة الأمثل.
- ثم يتصل عميل اللعبة مباشرة بذلك الخادم.
دراسة الحالة 4: الإطلاق التدريجي واختبار A/B
التحدي: تريد شركة تقنية إطلاق ميزة جديدة رئيسية ولكنها تريد اختبارها مع جمهور أصغر قبل الإصدار العالمي لتقليل المخاطر.
حل الحافة:
- يتم نشر الميزة الجديدة خلف علامة ميزة (feature flag).
- تقوم دالة الحافة بالتحقق من كل من ملف تعريف الارتباط (لمعرفة ما إذا كان المستخدم قد اشترك) وموقع المستخدم.
- تم تعيين المنطق لتمكين الميزة لجميع المستخدمين في سوق معين منخفض المخاطر، مثل نيوزيلندا ('NZ'). `if (geo.country === 'NZ') { enableFeature(); }`
- بالنسبة للمستخدمين خارج نيوزيلندا، يتم تقديم الإصدار القديم من الموقع.
- مع نمو الثقة في الميزة، يتم إضافة المزيد من البلدان إلى القائمة المسموح بها في دالة الحافة، مما يتيح إطلاقًا تدريجيًا ومتحكمًا فيه.
دليل التنفيذ: مثال على مستوى الكود
النظرية رائعة، لكن دعنا نرى كيف يبدو هذا عمليًا. سنستخدم صيغة Next.js Middleware، التي تعمل على دوال حافة Vercel، لأنها تطبيق شائع جدًا. المفاهيم قابلة للنقل بسهولة إلى مزودين آخرين مثل Cloudflare Workers أو Netlify Edge Functions.
السيناريو: نريد بناء نظام توجيه يقوم بما يلي:
- إعادة توجيه المستخدمين الكنديين (`/`) إلى نسخة كندية مخصصة من الموقع (`/ca`).
- توجيه جميع المستخدمين من ألمانيا وفرنسا بصمت إلى خلفية أوروبية مخصصة لمكالمات API إلى `/api/*`.
- حظر الوصول للمستخدمين من بلد افتراضي برمز 'XX'.
في مشروع Next.js الخاص بك، ستقوم بإنشاء ملف باسم `middleware.ts` على المستوى الجذر (أو داخل `src/`).
// src/middleware.ts import { NextRequest, NextResponse } from 'next/server'; // يمكن إدارة هذه القائمة في ملف تكوين منفصل أو قاعدة بيانات على الحافة const EU_COUNTRIES = ['DE', 'FR']; export const config = { // يحدد 'matcher' المسارات التي ستعمل عليها هذه الوظيفة الوسيطة. matcher: ['/', '/about', '/api/:path*'], }; export function middleware(request: NextRequest) { // 1. استخلاص البيانات الجغرافية من الطلب. // يتم ملء كائن `geo` تلقائيًا بواسطة شبكة حافة Vercel. const { geo } = request; const country = geo?.country || 'US'; // القيمة الافتراضية هي 'US' إذا كان الموقع غير معروف const pathname = request.nextUrl.pathname; // 2. المنطق: حظر الوصول من بلد معين if (country === 'XX') { // إرجاع استجابة 403 Forbidden. return new NextResponse(null, { status: 403, statusText: "Forbidden" }); } // 3. المنطق: إعادة توجيه المستخدمين الكنديين إلى المسار الفرعي /ca // نتحقق من أننا لسنا بالفعل على مسار /ca لتجنب حلقة إعادة التوجيه اللانهائية. if (country === 'CA' && !pathname.startsWith('/ca')) { const url = request.nextUrl.clone(); url.pathname = `/ca${pathname}`; // إرجاع استجابة 307 Temporary Redirect. return NextResponse.redirect(url); } // 4. المنطق: إعادة كتابة طلبات API للمستخدمين في الاتحاد الأوروبي إلى خادم خلفي إقليمي if (pathname.startsWith('/api') && EU_COUNTRIES.includes(country)) { const url = new URL(request.url); // تغيير اسم المضيف ليشير إلى الأصل المخصص للاتحاد الأوروبي. url.hostname = 'api.eu.your-service.com'; console.log(`Rewriting API request for user in ${country} to ${url.hostname}`); // إرجاع إعادة كتابة. يظل عنوان URL في متصفح المستخدم دون تغيير. return NextResponse.rewrite(url); } // 5. إذا لم تتطابق أي قاعدة، اسمح للطلب بالمتابعة إلى الصفحة أو مسار API. return NextResponse.next(); }
تحليل الكود:
- `config.matcher`: هذا تحسين حاسم. يخبر شبكة الحافة باستدعاء هذه الدالة فقط لمسارات محددة، مما يوفر تكاليف التنفيذ للأصول مثل الصور أو ملفات CSS.
- `request.geo`: هذا الكائن هو مصدر الحقيقة لبيانات الموقع التي توفرها المنصة. نحصل على رمز `country` ونوفر قيمة افتراضية معقولة.
- منطق الحظر: نقوم ببساطة بإرجاع `NextResponse` بحالة `403` لحظر الطلب مباشرة عند الحافة. لا يتم لمس الخادم الأصلي أبدًا.
- منطق إعادة التوجيه: نستخدم `NextResponse.redirect()`. هذا يرسل استجابة 307 مرة أخرى إلى المتصفح، ويخبره بطلب عنوان URL الجديد (`/ca`). هذا مرئي للمستخدم.
- منطق إعادة الكتابة: نستخدم `NextResponse.rewrite()`. هذا هو الإجراء الأقوى. يخبر شبكة الحافة بجلب المحتوى من عنوان URL مختلف (`api.eu.your-service.com`) ولكن تقديمه تحت عنوان URL الأصلي (`/api/...`). هذا شفاف تمامًا للمستخدم النهائي.
التحديات والاعتبارات
على الرغم من قوتها، فإن تنفيذ التوجيه الجغرافي على الحافة لا يخلو من التعقيدات. إليك بعض العوامل الحاسمة التي يجب مراعاتها:
1. دقة قواعد بيانات GeoIP
يتم اشتقاق بيانات الموقع من عنوان IP الخاص بالمستخدم عن طريق مطابقته مع قاعدة بيانات GeoIP. هذه القواعد دقيقة للغاية ولكنها ليست معصومة من الخطأ. قد يتم تحديد هوية المستخدمين على شبكات VPN أو شبكات الهاتف المحمول أو بعض شبكات الشركات بشكل خاطئ. لذلك، يجب عليك دائمًا توفير طريقة يدوية للمستخدمين لتجاوز موقعهم المكتشف (على سبيل المثال، محدد بلد في تذييل الموقع).
2. تعقيد التخزين المؤقت
إذا كنت تقدم محتوى مختلفًا لمناطق مختلفة لنفس عنوان URL، فإنك تخاطر بأن يرى مستخدم في بلد ما محتوى مخزنًا مؤقتًا مخصصًا لبلد آخر. لمنع هذا، يجب أن تطلب من CDN تخزين نسخ مختلفة من الصفحة مؤقتًا. يتم ذلك عادةً عن طريق إرسال رأس `Vary` في الاستجابة. على سبيل المثال، `Vary: x-vercel-ip-country` يخبر CDN بإنشاء إدخال ذاكرة تخزين مؤقت منفصل لكل بلد.
3. الاختبار والتصحيح
كيف تختبر أن منطق التوجيه الألماني الخاص بك يعمل بشكل صحيح دون السفر إلى ألمانيا؟ قد يكون هذا تحديًا. تشمل الطرق:
- شبكات VPN: استخدام VPN لتوجيه حركة المرور الخاصة بك عبر خادم في البلد المستهدف هو نهج شائع.
- محاكاة المنصة: تسمح بعض المنصات، مثل Vercel، لك بتجاوز بيانات `request.geo` محليًا أثناء التطوير لأغراض الاختبار.
- أدوات مطوري المتصفح: تحتوي بعض أدوات مطوري المتصفح على ميزات لتزييف الموقع، على الرغم من أن هذا قد لا يؤثر دائمًا على الكشف القائم على IP عند الحافة.
4. تطبيقات خاصة بالمزود
المفهوم الأساسي لتوجيه الحافة عالمي، لكن تفاصيل التنفيذ تختلف بين المزودين. تستخدم Vercel `request.geo`، وتستخدم Cloudflare خصائص على كائن `request.cf`، وهكذا. على الرغم من أن ترحيل المنطق ممكن، كن على علم بأنه ليس عملية نسخ ولصق بسيطة، ويوجد بعض التقييد بالمزود.
مستقبل الحافة جغرافي
التوجيه الجغرافي باستخدام دوال الحافة هو أكثر من مجرد تقنية ذكية؛ إنه تحول أساسي في كيفية بناء التطبيقات العالمية. مع ازدياد قوة منصات الحافة، يمكننا أن نتوقع قدرات أكثر تطوراً:
- قواعد بيانات الحافة: مع منتجات مثل Cloudflare D1 و Vercel KV، يمكن للبيانات نفسها أن تعيش على الحافة. هذا يسمح لك بتوجيه طلب المستخدم إلى أقرب دالة حافة، والتي يمكنها بعد ذلك قراءة البيانات وكتابتها من قاعدة بيانات في نفس الموقع الفعلي، مما يحقق استعلامات قاعدة بيانات بأجزاء من الثانية.
- تكامل أعمق: توقع اقترانًا أكثر إحكامًا بين أطر الواجهة الأمامية وقدرات الحافة، مما يزيل المزيد من التعقيد ويجعل التطوير العالمي أولاً هو الوضع الافتراضي.
- تخصيص محسّن: بالإضافة إلى البلد، سيتم اتخاذ قرارات التوجيه بناءً على المزيد من العوامل المتاحة عند الحافة، مثل نوع الجهاز وسرعة الاتصال وحتى الوقت من اليوم، لتقديم تجارب مخصصة للغاية.
الخلاصة: ابنِ للعالم، من الحافة
يمكّن التوجيه الجغرافي باستخدام دوال الحافة الأمامية المطورين من حل بعض التحديات الأكثر تعقيدًا في بناء التطبيقات لجمهور عالمي. من خلال نقل المنطق القائم على الموقع من الخوادم المركزية إلى شبكة حافة موزعة، يمكننا بناء تطبيقات ليست أسرع فحسب، بل وأكثر امتثالًا ومرونة وتخصيصًا بعمق.
القدرة على إعادة كتابة الطلبات وإعادة توجيهها وتعديلها بناءً على موقع المستخدم، كل ذلك بأقل زمن استجابة، تفتح مستوى جديدًا من تجربة المستخدم. من احترام سيادة البيانات من خلال توجيه البيانات الذكي إلى إسعاد المستخدمين بالمحتوى المترجم، فإن الإمكانيات هائلة. عند تصميم تطبيقك التالي، لا تفكر فقط في مكان استضافة الخادم الخاص بك؛ فكر في كيفية الاستفادة من شبكة الحافة العالمية لمقابلة المستخدمين في أماكنهم مباشرة.