ما هو CORS؟ قاعدة المتصفح وراء كل خطأ cross-origin
الطلبات البسيطة وطلبات preflight وبيانات الاعتماد، مع اختبارات curl.
اقرأ الدليلمساعدة CDN.com.tr
أضف Access-Control-Allow-Origin وترويسات CORS الأخرى إلى استجابات قاعدة تسليم، ودع خادمك الأصلي يجيب على طلبات preflight من نوع OPTIONS، واسمح في WAF بالطرق التي يستخدمها الـAPI الخاص بك.
التخزين المؤقت والأمان وWAF والمسح
أضف Access-Control-Allow-Origin وترويسات CORS الأخرى إلى استجابات قاعدة تسليم، ودع خادمك الأصلي يجيب على طلبات preflight من نوع OPTIONS، واسمح في WAF بالطرق التي يستخدمها الـAPI الخاص بك.
https://app.example.com، أو * للملفات التي يحق لأي أحد تحميلها.OPTIONS في تلك المسارات بـ200 أو 204.ما يرسله المتصفح يحدد أين يجري العمل.
GET عادي: لا يوجد طلب preflight، ويكفيها Access-Control-Allow-Origin في القاعدة. وما دام تحسين الصور على مستوى الحساب مفعّلًا، تأخذ ملفات .jpg و.jpeg و.png ترويسات الاستجابة الخاصة بأقدم قاعدة للنطاق، لا بالقاعدة الخاصة بمسارها.PUT وPATCH وDELETE: يرسل المتصفح طلب preflight أولًا؛ يجيب عليه خادمك الأصلي، ويمكن للقاعدة أن تضيف ترويسات CORS إلى تلك الاستجابة.*، إضافةً إلى Access-Control-Allow-Credentials true.اختر مصدرًا واحدًا لكل ترويسة.
always.Vary: Origin.مثال لـAPI ضمن /api/ يستدعيه تطبيق ويب واحد. اكتب ترويسة واحدة في كل سطر؛ والقيمة التي تحتوي مسافات تُكتب بين علامتي اقتباس مزدوجتين.
/api/.Access-Control-Allow-Origin https://app.example.com وAccess-Control-Allow-Methods "GET, POST, PUT, OPTIONS" وAccess-Control-Allow-Headers "Content-Type, Authorization" وAccess-Control-Max-Age 600.النتيجة المتوقعة: تُظهر القاعدة شارة مثل +4 من ترويسات الاستجابة، وتُظهر الصفحة منشور بمجرد أن تقدّمها الحافة.
مطلوب ما دام WAF على مستوى الموقع مفعّلًا وكان الـAPI يستخدم طرقًا غير GET وHEAD وPOST وOPTIONS.
PUT أو PATCH أو DELETE بحسب حاجة الـAPI الخاص بك، وأبقِ OPTIONS محدَّدة، واضغط Save.النتيجة المتوقعة: تؤكد اللوحة الحفظ، وينتشر التغيير خلال 1-2 دقيقة.
لا يفرض curl قواعد CORS، لذا يُظهر بالضبط ما تجيب به الحافة.
Origin.OPTIONS مع Origin وAccess-Control-Request-Method وAccess-Control-Request-Headers.النتيجة المتوقعة: يحمل الطلب البسيط access-control-allow-origin واحدة. ويجيب طلب preflight بـ200 أو 204 مع الأصل والطرق والترويسات المسموح بها.
curl -s -o /dev/null -D - -H 'Origin: https://app.example.com' https://www.example.com/api/items | grep -iE '^(HTTP|access-control)'
curl -s -o /dev/null -D - -X OPTIONS -H 'Origin: https://app.example.com' -H 'Access-Control-Request-Method: PUT' -H 'Access-Control-Request-Headers: content-type' https://www.example.com/api/items | grep -iE '^(HTTP|access-control|x-mt-blocked-by)'
يحمّل تطبيق ويب على app.example.com خطوطًا أو JSON أو استجابات API من www.example.com، فيحظرها المتصفح بخطأ CORS.
Header-Name value، دون نقطتين، مثل Access-Control-Allow-Origin https://app.example.com. والقيمة التي تحتوي مسافات تُكتب بين علامتي اقتباس مزدوجتين.Access-Control-* لهذه المسارات، فحدّد الاسم نفسه ضمن إزالة رؤوس، ليتلقى المتصفح قيمة واحدة.PUT أو PATCH أو DELETE وكان WAF على مستوى الموقع مفعّلًا، فحدّدها ضمن طرق HTTP المسموح بها في صفحة Security.always يُضاف أيضًا إلى استجابات 4xx و5xx من خادمك الأصلي.OPTIONS إلى خادمك الأصلي ولا تُخزَّن مؤقتًا أبدًا. عندما يجيب خادمك الأصلي على طلب preflight بـ200 أو 204، تُضاف ترويسات القاعدة إلى تلك الاستجابة؛ أما طلب preflight الذي يُجاب بـ401 أو 404 أو 405 فيصل إلى المتصفح دونها، ما لم ينتهِ السطر بـalways. وفي قاعدة فيها الحماية بكلمة مرور أو قائمة السماح لعناوين IP، تجيب الحافة بنفسها على طلب preflight الذي لا تسمح بمروره، بـ401 أو 403.Access-Control-Allow-Origin واحدة بالضبط: إذا وصلت قيمتان، يرفض المتصفح الاستجابة.Access-Control-Allow-Origin بحسب الموقع الطالب، فيجب أن يرسل أيضًا Vary: Origin. وتُبقي الحافة هذه النسخ منفصلة ما دام احتفظ بنسخة مخزنة واحدة مهما كان رأس Vary معطّلًا في القاعدة.Access-Control-Request-Method وAccess-Control-Request-Headers دون تحديد ضمن إزالة رؤوس: الأسماء المحدَّدة هناك تُزال أيضًا من الطلبات المرسلة إلى خادمك الأصلي، وخادمك الأصلي يقرأ هاتين الترويستين ليجيب على طلب preflight.GET وHEAD وPOST وOPTIONS. والطلب الذي يستخدم طريقة غير موجودة في القائمة يتلقى 403 دون ترويسات CORS ومع X-MT-Blocked-By: cdn-edge-security، ويعرضه المتصفح على أنه خطأ CORS..jpg و.jpeg و.png على ترويسات الاستجابة الخاصة بأقدم قاعدة للنطاق، لا بالقاعدة الخاصة بمسارها: ضع ترويسة CORS لهذه الصور في تلك القاعدة، مع قيمة ثابتة لـAccess-Control-Allow-Origin. وعندما تكون تلك القاعدة الأقدم هي قاعدة التحقق من الشهادة، لا تحصل على أي ترويسات من القواعد.تمرّر الحافة طلبات OPTIONS إلى خادمك الأصلي ولا تخزّنها مؤقتًا أبدًا، لذا يجب أن يجيب خادمك الأصلي على طلب preflight بـ200 أو 204. وتُضاف ترويسات الاستجابة الخاصة بالقاعدة إلى تلك الاستجابة: يمكن أن تأتي ترويسات CORS من القاعدة، ولا يلزم خادمك الأصلي سوى قبول OPTIONS. الاستثناء: في قاعدة فيها الحماية بكلمة مرور أو قائمة السماح لعناوين IP، تجيب الحافة بنفسها على طلب preflight الذي لا تسمح بمروره، بـ401 أو 403.
تضيف القاعدة القيمة نفسها إلى كل استجابة: * أو أصلًا واحدًا مثل https://app.example.com. وللسماح بعدة أصول، دع تطبيقك يرسل الأصل المطابق مع Vary: Origin، ولا تضع Access-Control-Allow-Origin في القاعدة. والطلبات التي تحمل ملفات تعريف الارتباط أو بيانات اعتماد أخرى تحتاج إلى أصل محدَّد بالاسم، لا *.
ابدأ بحالة الطلب الفاشل في لوحة الشبكة في المتصفح. استجابة 403 مع X-MT-Blocked-By: cdn-edge-security تأتي من الحافة: ابحث عنها في سجلات WAF، وإذا كانت طريقتها غير موجودة في القائمة، فأضفها ضمن طرق HTTP المسموح بها. وأي استجابة 4xx أو 5xx أخرى تصل افتراضيًا دون ترويسات القاعدة، فأصلح تلك الاستجابة أولًا. والسطر الذي ينتهي بـalways، مثل Access-Control-Allow-Origin https://app.example.com always، يُضاف أيضًا إلى استجابات 4xx و5xx من خادمك الأصلي. ثم تحقق من وصول Access-Control-Allow-Origin واحدة بالضبط وأنها تطابق الموقع الطالب، بما في ذلك المخطط (scheme).
ما دام WAF على مستوى الموقع مفعّلًا، افتح صفحة Security، وحدّد الطرق ضمن طرق HTTP المسموح بها واضغط Save؛ ينتشر التغيير خلال 1-2 دقيقة. ويفتح أساليب الطلب المسموح بها في تبويب الأمان في قواعد التسليم البطاقةَ نفسها. أبقِ OPTIONS محدَّدة: ترسلها المتصفحات لطلبات preflight.