فهرسة ملفات R2 بلا امتداد: ماذا يغيّر تحديث Cloudflare AI Search؟
يشرح هذا الدليل كيف يفهرس Cloudflare AI Search ملفات R2 بلا امتداد عبر Content-Type الصحيح، وما يبقى من تدقيق البيانات الوصفية والمزامنة والتحقق.

أزال Cloudflare AI Search في 11 سبتمبر 2026 عقبة كانت تعترض فهرسة ملفات R2 بسبب اسم الملف. فإذا كانت مستنداتك محفوظة تحت مفاتيح ثابتة بلا امتداد، بات بإمكانك الإبقاء على تلك المفاتيح وجعل الكائنات قابلة للبحث، شرط تخزين قيمة HTTP Content-Type مدعومة مع كل كائن.
وبذلك يمكن الاستغناء عن مرحلة إعادة التسمية في مسار إدخال المحتوى. لكن هذا لا يلغي تنظيف البيانات الوصفية، ولا الفهرسة، ولا الاختبار الذي يثبت أن المستند دخل نتائج البحث فعلًا.
ما الذي تغيّر فعليًا؟
Cloudflare AI Search خدمة بحث مُدارة مخصصة للمحتوى الذي تملكه. ويمكن تزويدها بالمحتوى عبر حاوية R2، وهي خدمة تخزين الكائنات من Cloudflare. يقرأ AI Search محتوى الحاوية، ويحوّل المستندات المدعومة إلى نص قابل للبحث، ثم ينشئ الفهرس الذي يستخدمه تطبيقك عند إرسال استعلام.
قبل هذا التحديث، كان المسار الآمن لاكتشاف نوع الملف يعتمد على امتداد اسمه. فالمفتاح manual.pdf يوضح للمفهرس نوع الملف، بينما لا يكشف المفتاح الثابت documents/manual-alpha ذلك.
أصبح بإمكان AI Search الآن الاعتماد على قيمة HTTP Content-Type المعتادة للكائن الذي لا يحمل امتدادًا. فالقيمة application/pdf تعني أن البايتات تمثل ملف PDF، والقيمة text/markdown تعني أنها بصيغة Markdown. وتدرج Cloudflare أيضًا text/plain وapplication/json وtext/html وtext/csv ضمن الأنواع المدعومة.
هذا لا يعني اختفاء امتدادات الملفات. فما زالت Cloudflare تعدّ الامتداد المعروف المسار المفضل والأسرع لاكتشاف النوع. وتظهر فائدة المسار الجديد حين تؤدي إعادة تسمية المفتاح إلى كسر عناوين URL، أو مراجع قواعد البيانات، أو ربط المستأجرين، أو التوقيعات، أو عقد رفع قائم لديك بالفعل.
وهنا يلزم التمييز بدقة: Content-Type بيانات HTTP وصفية محفوظة على كائن R2، وليست البيانات الوصفية المخصصة التي يستخدمها AI Search للتصفية حسب الفئة أو العميل أو حالة المستند. تنتقل هذه الحقول المخصصة داخل ترويسات x-amz-meta-*، وتتطلب مخططًا في AI Search. وإضافة x-amz-meta-content-type لا تغني عن حقل HTTP الحقيقي.
يمس هذا التحديث مرحلة إدخال المصدر، أي النقطة التي يدخل عندها المستند إلى الفهرس. ولا يغيّر النموذج الذي يصوغ الإجابة بعد استرجاع المحتوى. أما تحديث GLM-5.3 Flash فيقع في مرحلة التوليد اللاحقة.
الأثر العملي: نظام تسمية أقل
شيوع المفاتيح المبهمة له أسبابه. فقد يستخدم المنتج معرّفًا ثابتًا من قاعدة البيانات كمفتاح R2 كي يتغير الكائن من دون أن يتغير عنوانه. وقد تتجنب خدمة مستندات كشف اسم الملف الأصلي للعميل. كذلك قد يعتمد عنوان URL موقّع على المفتاح نفسه حرفيًا.
كان الحل الالتفافي السابق يتمثل في إنشاء اسم ذي امتداد لنسخة البحث، أو إضافة مرحلة إعادة تسمية قبل أن يرى AI Search الكائن. وهذا ينشئ هوية إضافية يجب تخزينها ومطابقتها وتنظيفها.
يتيح التحديث إبقاء المفتاح الأصلي في مكانه متى كانت بيانات HTTP الوصفية صحيحة أصلًا. وهذا هو الاختصار المفيد في سير العمل.
فيما يلي تقدير للعمل قبل التحديث وبعده. إنه نموذج للعملية، وليس قياس أداء فعليًا ولا وفرًا مضمونًا.

لا يتضمن الجدول عمدًا أي ادعاء عن وفر مالي. فلم تنشر Cloudflare مقدارًا زمنيًا يوفره هذا التحديث، كما أن الإصدار لا يعيد كتابة البيانات الوصفية الموجودة نيابة عنك.
ما تكلفة العمل المتبقي؟
يتاح AI Search مجانًا خلال مرحلته التجريبية المفتوحة ضمن حدود خطة Workers التي تستخدمها. ويشمل ذلك التخزين والفهرسة المتجهية. وقد تظل رسوم Workers AI وAI Gateway منفصلة، لكن تغيير الإدخال هذا لا يعدّل أسعارها.
قد ينعكس إصلاح البيانات الوصفية على فاتورة R2. فعمليات ListObjects وPutObject وCopyObject تُحسب ضمن عمليات Class A. أما HeadObject وGetObject، اللتان قد تستخدمهما أداة الإصلاح لفحص كائن أو قراءته، فتُحسبان ضمن عمليات Class B.
في فئة التخزين Standard، تبلغ تكلفة طلبات Class A مقدار $4.50 لكل مليون طلب بعد الحصة الشهرية المجانية البالغة 1 مليون. أما Infrequent Access فلا تقدم حصة مجانية، وتبلغ تكلفة طلبات Class A فيها $9.00 لكل مليون. وقد تُفرض أيضًا تكلفة $0.01 لكل GB عند قراءة الكائنات أو نسخها.
ومن هنا تأتي قاعدة الميزانية الواضحة: الكائن الذي يحمل Content-Type صحيحًا لا يحتاج إلى إصلاح خاص بإعادة التسمية. أما الكائن ذو القيمة الخاطئة فقد يظل بحاجة إلى عملية كتابة أو نسخ، بحسب الأداة المستخدمة. احسب هذه العمليات قبل جدولة تنظيف يشمل الحاوية كلها.
ويهم الحجم أيضًا في AI Search. الحد لكل مثيل هو 100,000 ملف ضمن Workers Free. وتسمح Workers Paid بـ1 مليون ملف، أو 500,000 ملف عند تفعيل البحث الهجين. ويبقى حد الملف البالغ 4 MB كما هو في الخطتين.
من يمكنه الاستفادة من ذلك غدًا؟
مؤسس SaaS مستقل يستخدم معرّفات رفع ثابتة
احتفظ بمفتاح R2 المخزن أصلًا في قاعدة بياناتك، واجعل أداة الرفع ترفق نوع MIME الحقيقي عند كتابة الكائن. عندئذ يستطيع بحث الدعم لديك إدخال الكائن نفسه من دون عمود ثانٍ لأسماء الملفات، ومن دون مهمة دفعية تنشئ نسخًا مخصصة للبحث.
تتمثل الفائدة في تقليل الهويات التي ينبغي مطابقتها عندما يستبدل العميل مستندًا أو يحذفه أو ينقله. ومع ذلك، يجب أن ترفض عملية الرفع النوع الثنائي العام إذا كان يفترض أن يصبح الكائن قابلًا للبحث.
مهندس منصات يدير حاوية قديمة
اعرض الكائنات التي بلا امتداد مع بيانات HTTP الوصفية، وقارن كل قيمة بأنواع MIME التي تدعمها Cloudflare، ثم اعزل الحالات الفاشلة. أصلح عينة صغيرة قبل التعامل مع الحاوية كلها.
الفائدة هنا هي هجرة محدودة النطاق. فلا تنفق ميزانية الإصلاح إلا على الكائنات التي تحتاج إليه، بينما تنتقل المفاتيح ذات البيانات الوصفية الصحيحة مباشرة إلى المزامنة والتحقق.
فريق منتج متعدد المستأجرين
أبقِ مفاتيح الكائنات مبهمة كي لا تكشف أسماء الملفات الأصلية، واضبط Content-Type استنادًا إلى فحص موثوق على الخادم أثناء الرفع. وطبّق مرشحات المسارات أو البادئات في AI Search على نحو مستقل عندما يحتاج كل مستأجر إلى نطاق فهرسة خاص به.
الفائدة هي اتساق البنية. تظل هوية التخزين مستقلة عن طريقة عرض الملف، بينما يحصل المفهرس على نوع يمكنه التحقق منه.
وكالة تدير قواعد معرفة لعملائها
افصل بين وظيفتي البيانات الوصفية في دليل التشغيل. تحدد قيمة HTTP Content-Type ما إذا كان يمكن إدخال ملف بلا امتداد. أما حقول x-amz-meta-* المخصصة فتحدد كيفية تصفية النتائج المفهرسة بعد تعريف مخططها.
الفائدة هي تشخيص أوضح. فعندما يغيب مستند، يفحص الفريق بيانات الإدخال الوصفية قبل تغيير قواعد التصفية أو نموذج الإجابة.
كيف تبدأ فهرسة ملفات R2 بلا امتداد عبر المسار المدعوم؟
تقبل واجهة R2 Workers API ترويسات الطلب بصيغة httpMetadata. يحافظ Worker التالي على مسار الطلب بوصفه مفتاح الكائن، ويرفض عمليات الرفع التي تصل من دون Content-Type.
اربط حاوية R2 باسم DOCS في wrangler.jsonc:
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "r2-document-upload",
"main": "src/index.ts",
"compatibility_date": "2026-09-11",
"r2_buckets": [
{
"binding": "DOCS",
"bucket_name": "your-bucket"
}
]
}ثم استخدم Worker التالي:
interface Env {
DOCS: R2Bucket;
}
export default {
async fetch(request, env): Promise<Response> {
if (request.method !== "PUT") {
return new Response("Method Not Allowed", { status: 405 });
}
const key = new URL(request.url).pathname.replace(/^\//, "");
const contentType = request.headers.get("content-type");
if (!key || !contentType) {
return new Response("Key and Content-Type are required");
}
await env.DOCS.put(key, request.body, {
httpMetadata: request.headers,
});
return new Response(`Stored ${key}`);
},
} satisfies ExportedHandler<Env>;شغّل npx wrangler dev، واضبط WORKER_URL على العنوان المحلي الذي يعرضه Wrangler، ثم ارفع ملف PDF محليًا إلى وجهة بلا امتداد:
curl "$WORKER_URL/documents/manual-alpha" \
--request PUT \
--header "Content-Type: application/pdf" \
--data-binary @manual.pdfيثبت هذا المثال جانب التخزين، لكنه لا يثبت حدوث الفهرسة. وفي بيئة الإنتاج، أضف آلية مصادقة، واستنتج النوع عبر فحص موثوق بدل الاعتماد على اسم الملف الذي يقدمه المستخدم وحده، ثم قارنه بقائمة Cloudflare المدعومة.
بصراحة: نجاح الرفع لا يعني أن الملف أصبح قابلًا للبحث
تتسم عمليات الكتابة في R2 بالاتساق القوي، لذلك يظهر الكائن وبياناته الوصفية بعد نجاح الكتابة. أما الفهرسة في AI Search فهي مهمة غير متزامنة منفصلة؛ فقد يُقبل طلب المزامنة ثم يفشل العنصر لاحقًا.
تتزامن المثيلات المعتمدة على R2 كل 6 ساعات افتراضيًا. ويمكن اختيار فاصل زمني قدره 1 أو 2 أو 4 أو 6 أو 12 أو 24 ساعة، أو بدء مهمة بنفسك:
npx wrangler ai-search jobs create <INSTANCE_NAME>يمكن تشغيل المزامنة اليدوية للمصدر مرة واحدة كل 30 ثانية كحد أقصى. وتكرار المحاولة لا يصلح البيانات الوصفية الخاطئة.
افحص سجلات العناصر أو تفاصيلها أو إحصاءات المثيل بعد انتهاء المهمة. ويشير الخطأ unsupported_type على مستوى العنصر إلى عجز AI Search عن قبول نوع الملف المكتشف. أصلح الكائن، ثم أعد مزامنة ذلك العنصر أو المصدر.
لن يؤثر فيك هذا التغيير إذا كان كل مفتاح R2 يحمل امتدادًا معروفًا أصلًا. ولن يؤثر فيك أيضًا إذا كان مصدر AI Search موقعًا إلكترونيًا أو مساحة تخزين مدمجة، وليس حاوية R2 خارجية. كما أن التحديث لا يجعل صيغة غير مدعومة أو ملفًا يتجاوز الحد الأقصى قابلًا للفهرسة.
ما العمل يوم الاثنين؟
ابدأ بالتدقيق، لا بإعادة كتابة شاملة.
اعثر على الكائنات المتخطاة التي بلا امتداد
اعرض كائنات R2 مع تضمين
httpMetadata، وواصل التنقل بين الصفحات حتى تصبحtruncatedبقيمة false، ثم اعزل المفاتيح التي لا يحمل آخر جزء من مسارها امتدادًا. طابق هذه المفاتيح مع سجلات عناصر AI Search وحالات فشلunsupported_type.صنّف البيانات الوصفية
افصل أنواع MIME المدعومة عن القيم المفقودة أو المشوهة أو غير المدعومة وعن
application/octet-stream. ولا تُدخل حقولx-amz-meta-*المخصصة في هذا الفحص، لأنها تعالج مشكلة مختلفة.أصلح دفعة استيراد صغيرة
اختر مجموعة صغيرة تمثل الصيغ التي تخزنها فعلًا. اكتب كل كائن أو انسخه مع قيمة HTTP
Content-Typeالصحيحة، مع إبقاء المفتاح الأصلي حيثما تتيح أداتك ذلك.زامن وتحقق من الاسترجاع
شغّل مزامنة واحدة للمصدر. انتظر حتى تكتمل معالجة العناصر، وافحص سجلاتها، ثم ابحث عن عبارة معروفة داخل كل مستند. نجاح الكتابة إلى التخزين ليس خط النهاية؛ بل استرجاع مقطع من المصدر هو الإثبات.
وسّع النطاق بعد الإثبات فقط
قدّر عدد عمليات Class A وClass B التي ستنشئها طريقة الإصلاح، وتحقق من فئة تخزين R2، ثم وسّع الدفعة. وحدّث أداة الرفع في الوقت نفسه كي تصل الكائنات الجديدة التي بلا امتداد ببيانات وصفية مدعومة.
تحرك هذا الأسبوع إذا كانت مفاتيح R2 الثابتة أو المبهمة قد أجبرتك على صيانة مسار تسمية ثانٍ من أجل AI Search. وانتظر إذا كانت الكائنات الموجودة تفتقر إلى معلومات موثوقة عن النوع، لأنك تحتاج إلى خطة تصنيف قبل إعادة الكتابة. ولا تفعل شيئًا إذا كانت الامتدادات المعروفة تدير مسار الإدخال لديك من دون مشكلة.
إذا أردت تحويل التغيير التالي في المنصة إلى قرار تشغيلي واضح، انضم إلى النشرة البريدية.
- آخر تحديث
- 12 سبتمبر 2026
- التصنيف
- Explained







