خطأ "تم رفض الوصول" عند الوصول إلى كائن مستند iframe

StackOverflow https://stackoverflow.com/questions/151362

  •  02-07-2019
  •  | 
  •  

سؤال

لنشر نماذج AJAX في نموذج يحتوي على العديد من المعلمات، أستخدم حلاً لإنشاء ملف iframe, ، ونشر النموذج إليه عن طريق POST، ثم الوصول إلى iframeمحتوى.على وجه التحديد، أقوم بالوصول إلى المحتوى مثل هذا:

$("some_iframe_id").get(0).contentWindow.document

لقد اختبرت ذلك وعملت.

في بعض الصفحات، بدأت أتلقى رسالة الخطأ "تم رفض الوصول".وبقدر ما أعرف، لا ينبغي أن يحدث هذا إذا تم تقديم إطار iframe من نفس المجال.

أنا متأكد من أنه كان يعمل من قبل.أي شخص لديه فكرة؟

إذا لم أكن واضحًا بما فيه الكفاية:أنا أقوم بالنشر إلى نفس المجال.لذلك هذا ليس طلبًا عبر النطاقات.أنا أختبر على IE فقط.

ملاحظة.لا يمكنني استخدام استعلامات ajax POST البسيطة (لا تسأل...)

هل كانت مفيدة؟

المحلول

حلها بنفسي!

كانت المشكلة أنه على الرغم من إرسال الاستجابة الصحيحة (تم التحقق منها باستخدام Fiddler)، فقد تم إرسالها برمز خطأ HTTP 500 (بدلاً من 200).

لذلك اتضح أنه إذا تم إرسال استجابة مع رمز خطأ، فإن IE يستبدل محتوى ملف iframe مع رسالة خطأ تم تحميلها من القرص (res://ieframe.dll/http_500.htm)، ويؤدي ذلك إلى حدوث خطأ في رفض الوصول عبر المجال.

نصائح أخرى

احذر من القيود الأمنية المرتبطة بـ إطارات iFrames, ، يحب عبر النطاق التقييد (المعروف أيضًا باسم CORS).فيما يلي 3 أخطاء شائعة تتعلق بـ CORS:

  1. قم بتحميل iFrame بمجال مختلف.(السابق:افتتاح "www.foo.com"بينما الإطار العلوي"www.ooof.com")

  2. قم بتحميل iFrame بمنفذ مختلف:عنوان URL الخاص بـ iFrame ميناء يختلف عن الإطار العلوي.

  3. بروتوكولات مختلفة:تحميل مورد iFrame عبر HTTPS بينما يستخدم الإطار الأصلي HTTP.

مشكلتي كانت X-Frame-Options رأس HTTP.تم ضبط تكوين Apache الخاص بي على:

Header always append X-Frame-Options DENY

إزالته سمح لها بالعمل.على وجه التحديد في حالتي كنت أستخدم نقل iframe لـ jQuery مع البرنامج المساعد لتحميل ملف jQuery لتحميل الملفات في IE 9 وIE 10.

أعلم أن هذا السؤال قديم جدًا، لكني أردت أن أذكر أن الإجابة أعلاه كانت مناسبة لي:تعيين نطاق document.domain ليكون هو نفسه في كل صفحة من الصفحات - الصفحة الرئيسية وصفحة iframe.ولكن خلال بحثي وجدت هذا المقال المثير للاهتمام:

http://softwareas.com/cross-domain-communication-with-iframes

لاحظ ما إذا كان لديك إطار iframe به src='javascript:void(0)' ثم جافا سكريبت مثل frame.document.location =... سوف تفشل مع خطأ رفض الوصول في IE.تم استخدام مكتبة جافا سكريبت التي تتفاعل مع الإطار المستهدف.على الرغم من أن الموقع الذي كان يحاول تغيير الإطار إليه كان على نفس المجال كأصل، فقد تم تعيين إطار iframe في البداية على javascript:void مما أدى إلى ظهور خطأ رفض الوصول عبر النطاقات.

لحل هذه المشكلة، قمت بإنشاء صفحة فارغة.html في موقعي وإذا كنت بحاجة إلى الإعلان عن إطار iframe مقدمًا والذي سيكون فارغًا في البداية حتى يتم تغييره عبر جافا سكريبت، فأنا أقوم بتوجيهه إلى الصفحة الفارغة بحيث src='/content/blank.html' موجود في نفس المجال.

بدلاً من ذلك، يمكنك إنشاء إطار iframe بالكامل من خلال جافا سكريبت بحيث يمكنك تعيين src عند إنشائه، ولكن في حالتي كنت أستخدم مكتبة تتطلب الإعلان عن إطار iframe بالفعل على الصفحة.

في الأساس، يحدث هذا الخطأ عندما يكون للمستند الموجود في الإطار وخارجه نطاقات مختلفة.لذلك، لمنع البرمجة النصية عبر الجانب، تقوم المتصفحات بتعطيل هذا التنفيذ.

إذا كانت مشكلة المجال (أو المجال الفرعي) مثل www.foo.com إرسال طلب إلى www.api.foo.com

في كل صفحة يمكنك ضبط

document.domain = www.foo.com

للسماح بأذونات "عبر المجال".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top