استخدام Azure CDN مع CORS

ما هو CORS؟

CORS (مشاركة الموارد عبر المنشأ) هي ميزة HTTP تمكن تطبيق ويب يعمل ضمن مجال واحد من الوصول إلى الموارد في مجال آخر. للحد من الهجمات على البرمجة النصية عبر المواقع، تفرض جميع مستعرضات الويب الحديثة قيود أمنية تُعرف باسم نهج الأصل نفسه. يمنع هذا التقييد صفحة ويب من استدعاء واجهات برمجة التطبيقات في مجال مختلف. توفر ميزة CORS طريقة آمنة للسماح بمصدر واحد (المجال الأصل) باستدعاء واجهات برمجة التطبيقات في أصل آخر.

كيف تعمل هذه الميزة

هناك نوعان من طلبات CORS، الطلبات البسيطة والطلبات المعقدة.

للطلبات البسيطة:

  1. يرسل المستعرض طلب CORS مع عنوان طلب HTTP الأصل الإضافي. قيمة عنوان الطلب هي الأصل الذي يخدم الصفحة الأصل، والتي يتم تعريفها على أنها مزيج من البروتوكول والمجال والمنفذ. عندما تحاول صفحة من HTTPS://www.contoso.com الوصول إلى بيانات مستخدم في الأصل fabrikam.com، سيتم إرسال عنوان الطلب التالي إلى fabrikam.com:

    Origin: https://www.contoso.com

  2. قد يستجيب الخادم بأي من العناوين التالية:

    • عنوان Access-Control-Allow-Origin في استجابته للإشارة إلى الموقع المصدر المسموح به. على سبيل المثال:

      Access-Control-Allow-Origin: https://www.contoso.com

    • رمز خطأ HTTP مثل 403 إذا كان الخادم لا يسمح بطلب عبر المصدر بعد التحقق من عنوان المصدر

    • عنوان Access-Control-Allow-Origin مع حرف بدل يسمح بجميع المصادر:

      Access-Control-Allow-Origin: *

للطلبات المعقدة:

يعني الطلب المعقد بأنه طلب CORS حيث يطلب من المستعرض إرسال طلب التحقق من الصحة (أيّ، فحص أولي) قبل إرسال طلب CORS الفعلي. يطلب طلب ما قبل التشغيل إذن الخادم إذا كان بإمكان طلب CORS الأصلي المتابعة، وكان طلب OPTIONS إلى نفس عنوان URL.

تلميح

لمزيد من التفاصيل حول تدفقات CORS والأخطاء الشائعة، اطلع على دليل CORS لواجهات برمجة تطبيقات REST.

سيناريوهات البدل أو المصدر الفردي

يعمل CORS على Azure CDN تلقائيا دون تكوينات إضافية عند تعيين رأس Access-Control-Allow-Origin إلى حرف بدل (*) أو أصل واحد. تستخدم CDN ذاكرة التخزين المؤقت للاستجابة الأولى والطلبات اللاحقة نفس العنوان.

إذا تم بالفعل تقديم طلبات إلى CDN قبل تعيين CORS على الأصل الخاص بك، فستحتاج إلى إزالة المحتوى على محتوى نقطة النهاية لإعادة تحميل المحتوى باستخدام عنوان Access-Control-Allow-Origin .

سيناريوهات للمصدر متعددة

إذا كنت بحاجة إلى السماح بقائمة محددة من المصادر لتكون متاحة لـ CORS، فستصبح فإن الأمور أكثر تعقيداً. تحدث المشكلة عندما تقوم شبكة تسليم المحتوى بالتخزين المؤقت لعنوان Access-Control-Allow-Origin لأول مصدر CORS. عندما يقوم أصل CORS مختلف بإجراء طلب لاحق، تخدم شبكة تسليم المحتوى عنوان Access-Control-Allow-Origin المخزن مؤقتا، والذي لا يتطابق. توجد طرق عديدة لحل هذه المشكلة.

ملفات تعريف قياسية لـ Azure CDN

في Azure CDN Standard من Microsoft، يمكنك إنشاء قاعدة في محرك القواعد القياسية للتحقق من عنوان الأصل على الطلب. إذا كان أصل صالحا، فقم بتعيين عنوان Access-Control-Allow-Origin بالقيمة المطلوبة. في هذه الحالة، يتم تجاهل عنوان Access-Control-Allow-Origin من ملقم الأصل للملف، ويقوم محرك قواعد CDN بإدارة الأصول المسموح بها بالكامل لمشاركة الموارد عبر الأصول (CORS).

مثال للقواعد مع محرك القواعد القياسية

تلميح

يمكنك إضافة إجراءات إضافية إلى القاعدة لتعديل عناوين استجابة إضافية، مثل Access-Control-Allow-Methods.

Azure CDN Premium من Edgio

باستخدام محرك قواعد Edgio Premium، تحتاج إلى إنشاء قاعدة للتحقق من رأس الأصل على الطلب. إذا كان أصل صالحا، تقوم القاعدة بتعيين عنوان Access-Control-Allow-Origin مع الأصل المقدم في الطلب. إذا لم يكن الأصل المحدد في رأس الأصل مسموحا به، فيجب أن تحذف القاعدة عنوان Access-Control-Allow-Origin ، مما يؤدي إلى رفض المستعرض للطلب.

هناك طريقتان لحل هذه المشكلة مع محرك قواعد Premium. في الحالتين، سيتم تجاهل عنوان Access-Control-Allow-Origin من ملقم الأصل للملف، وسيدير محرك قواعد CDN الأصول المسموح بها بالكامل لمشاركة الموارد عبر الأصول.

تعبير عادي واحد مع جميع الأصول الصالحة

في هذه الحالة، يمكنك إنشاء تعبير عادي يتضمن كافة الأصول التي تريد السماح بها:

https?:\/\/(www\.contoso\.com|contoso\.com|www\.microsoft\.com|microsoft.com\.com)$

تلميح

يستخدم Azure CDN Premium من Edgio التعبيرات العادية المتوافقة مع Perl كمحرك للتعبيرات العادية. يمكنك استخدام أداة مثل Regular Expressions 101 للتحقق من صحة التعبير العادي. لاحظ أن الحرف "/" صالح في التعبيرات العادية وليس هناك حاجة لتجاوزه ولكن، يعتبر تجاوز هذا الحرف أحد أفضل الممارسات ويتوقعه بعض مدققي regex.

إذا تطابق التعبير العادي، تستبدل القاعدة رأس Access-Control-Allow-Origin (إن وجد) من الأصل بالأصل الذي أرسل الطلب. يمكنك أيضا إضافة رؤوس CORS إضافية، مثل Access-Control-Allow-Methods.

مثال قواعد مع تعبير عادي

طلب قاعدة عنوان لكل أصل.

بدلاً من التعبيرات العادية، يمكنك إنشاء قاعدة منفصلة لكل أصل ترغب في السماح به باستخدام شرط المطابقة حرف بدل لطلب عنوان. كما هو الحال مع أسلوب التعبير العادي، يُعيّن محرك القواعد وحده عناوين مشاركة الموارد عبر الأصول.

مثال قواعد بدون تعبير عادي

تلميح

في المثال، استخدام حرف البدل * يخبر مشغل القواعد بمطابقة كل من HTTP وHTTPS.