استخدام Azure CDN مع CORS
ما هو CORS؟
تُعد CORS (مشاركة الموارد عبر المصادر) ميزة HTTP التي تعمل على تمكين تطبيق ويب يعمل ضمن مجال واحد للوصول إلى موارد في مجال آخر. من أجل تقليل إمكانية هجمات البرمجة النصية عبر المواقع ، تنفذ جميع متصفحات الويب الحديثة قيودا أمنية تعرف باسم سياسة نفس المنشأ. يمنع هذا صفحة ويب من استدعاء واجهات برمجة التطبيقات في مجال مختلف. توفر ميزة CORS طريقة آمنة للسماح بمصدر واحد (المجال الأصل) باستدعاء واجهات برمجة التطبيقات في أصل آخر.
كيف تعمل هذه الميزة
هناك نوعان من طلبات CORS، الطلبات البسيطة والطلبات المعقدة.
للطلبات البسيطة:
يرسل المتصفح طلب CORS مع رأس طلب HTTP أصلي إضافي. قيمة هذا الرأس هي الأصل الذي خدم الصفحة الرئيسية، والتي يتم تعريفها على أنها مزيج من البروتوكولوالمجالوالمنفذ. عندما تحاول صفحة من https://www.contoso.com صفحة الوصول إلى بيانات مستخدم في الأصل fabrikam.com، سيتم إرسال رأس الطلب التالي إلى fabrikam.com:
Origin: https://www.contoso.comقد يستجيب الخادم بأي مما يلي:
عنوان 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 على منشئك ، فستحتاج إلى إزالة المحتوى على محتوى نقطة النهاية لإعادة تحميل المحتوى باستخدام رأس التحكم في الوصول والسماح بالأصل .
سيناريوهات للمصدر متعددة
إذا كنت بحاجة إلى السماح بقائمة محددة من المصادر لتكون متاحة لـ CORS، فستصبح فإن الأمور أكثر تعقيداً. تحدث المشكلة عندما تقوم شبكة تسليم المحتوى بالتخزين المؤقت لعنوان Access-Control-Allow-Origin لأول مصدر CORS. عندما يقدم أصل CORS مختلف طلبا لاحقا ، ستخدم CDN رأس Access-Control-Allow-Origin المخزن مؤقتا ، والذي لن يتطابق. هناك عدة طرق لتصحيح ذلك.
Azure CDN standard profiles
على Azure CDN Standard من Microsoft، يمكنك إنشاء قاعدة في محرك القواعد القياسية للتحقق من رأس الأصل عند الطلب. إذا كان منشأ صالحا، فستقوم قاعدتك بتعيين رأس Access-Control-Allow-Origin بالقيمة المطلوبة. في هذه الحالة، يتم تجاهل رأس Access-Control-Allow-Origin من الخادم الأصلي للملف ويقوم محرك قواعد CDN بإدارة أصول CORS المسموح بها بالكامل.

تلميح
يمكنك إضافة إجراءات إضافية إلى القاعدة لتعديل عناوين استجابة إضافية، مثل Access-Control-Allow-Methods.
على Azure CDN Standard من Akamai ، فإن الآلية الوحيدة للسماح بأصول متعددة دون استخدام أصل حرف البدل هي استخدام التخزين المؤقت لسلسلة الاستعلام. قم بتمكين إعداد سلسلة الاستعلام لنقطة نهاية CDN ثم استخدم سلسلة استعلام فريدة للطلبات من كل مجال مسموح به. سيؤدي القيام بذلك إلى قيام CDN بالتخزين المؤقت لكائن منفصل لكل سلسلة استعلام فريدة. ومع ذلك ، فإن هذا النهج ليس مثاليا ، لأنه سيؤدي إلى نسخ متعددة من نفس الملف المخزن مؤقتا على CDN.
Azure CDN Premium من Verizon
باستخدام محرك قواعد Verizon Premium، ستحتاج إلى إنشاء قاعدة للتحقق من رأس Origin عند الطلب. إذا كان منشأ صالحا، فستقوم قاعدتك بتعيين رأس الوصول-التحكم-السماح-الأصل مع الأصل المتوفر في الطلب. إذا كان الأصل المحدد في رأس الأصل غير مسموح به، فيجب أن تحذف قاعدتك رأس الوصول-التحكم-السماح-المنشأ ، مما سيؤدي إلى رفض المستعرض للطلب.
هناك طريقتان للقيام بذلك باستخدام محرك قواعد Premium. في كلتا الحالتين ، يتم تجاهل رأس Access-Control-Allow-Origin من الخادم الأصلي للملف ويقوم محرك قواعد CDN بإدارة أصول CORS المسموح بها بالكامل.
تعبير واحد منتظم مع جميع الأصول الصالحة
في هذه الحالة، ستقوم بإنشاء تعبير منتظم يتضمن جميع الأصول التي تريد السماح بها:
https?:\/\/(www\.contoso\.com|contoso\.com|www\.microsoft\.com|microsoft.com\.com)$
تلميح
يستخدم Azure CDN Premium من Verizonالتعبيرات العادية المتوافقة مع Perl كمحرك للتعبيرات العادية. يمكنك استخدام أداة مثل التعبيرات العادية 101 للتحقق من صحة تعبيرك العادي. لاحظ أن الحرف "/" صالح في التعبيرات العادية ولا يحتاج إلى الهروب ، ومع ذلك ، فإن الهروب من هذا الحرف يعتبر أفضل ممارسة ويتوقعه بعض مدققي regex.
إذا تطابق التعبير العادي، فستستبدل قاعدتك رأس الوصول-التحكم-السماح-الأصل (إن وجد) من الأصل بالأصل الذي أرسل الطلب. يمكنك أيضا إضافة رؤوس CORS إضافية، مثل طرق التحكم في الوصول.

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

تلميح
في المثال أعلاه، يؤدي استخدام حرف البدل * إلى إخبار محرك القواعد بمطابقة كل من HTTP وHTTPS.