سؤال

لقد قمت بإعداد مشاركة الموارد المتقاطعة على خادم (رصيف باستخدام crossoriginfilter) وهو يعمل بشكل مثالي على IE8 و Firefox. على Chrome ، إنه فقط ... لا.

  $.ajax({ url : crossOriginURL,
    type : "GET",
    error : function(req, message) {
        alert(message);
    },
    dataType :  "json" } );

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

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

المحلول 3

ما نجح لي أخيرًا هو xhr.setRequestHeader('Content-Type', 'text/plain');

نصائح أخرى

لقد حلت مشكلتي بهذه الطريقة:

أضف هذا إلى رمز PHP الخاص بك:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true ");
header("Access-Control-Allow-Methods: OPTIONS, GET, POST");
header("Access-Control-Allow-Headers: Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control");

أو أضف هذه الرؤوس إلى ردك.

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

تعديل: جرب هذا (بدون اختراقك) لمعرفة ما إذا كنت تتلقى البيانات ...

$.ajax({ url : crossOriginURL,
    type : "GET",
    error : function(req, message) {
        alert(message);
    },
    success : function(data) {
        alert(data);
    },
    dataType :  "text"} );

يبدو أن الملصق الأصلي قد يكون قد حل مشكلته ، ولكن بالنسبة لأي شخص لديه نفس القضية مثل المعلق إليزابيث ، أعتقد أن المشكلة قد تكون أن Chrom ملف محلي. لن يسمح لك حتى بتجاوز رأس الأصل بشكل صريح. هذا يتسبب في رؤية الخادم "الأصل: فارغ" ، مما يؤدي إلى 403 في معظم الحالات. يبدو أن Firefox ليس له مثل هذا القيد ، كما وجدت بعد الكثير من التخلص من الشعر.

إذا كنت بحاجة تمامًا إلى استخدام Chrome في هذه الحالة ، فيمكنك حل مشكلتك عن طريق تشغيل خادم الويب محليًا والوصول دائمًا إلى ملفك عبر http: بدلاً من عبر الملف:.

في حالتي ، هو مضيف محلي: 8001 (الواجهة الأمامية) التي تحاول استدعاء واجهات برمجة التطبيقات في LocalHost: 7001 (على server.js كخادم عقدة). حتى أنني قمت بتثبيت المكون الإضافي CORS وتم تشغيله على Chrome ، لا تزال سياسة CORS رفضتها كحالات Preflight.

استغرق الأمر مني أكثر من نصف يوم لحل المشكلة أخيرًا. فيما يلي الخطوات "الغبية" ، صدق أو لا تصدق:

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

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

ثالثا. ومع ذلك ، إذا كنت لا تزال تحصل على رفض CORS ، فقم بإلغاء تثبيت Chrome وتثبيت Chrome.

رابعا. على Chrome الجديد ، يجب أن يكون المكون الإضافي CORS المثبت سابقًا موجودًا ولكن مع حالة إيقاف التشغيل.

v. إعادة تحميل الصفحة ، يجب أن تحصل على رسائل رفض CORS على وحدة التحكم وهي صحيحة.

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

لا توجد أفكار أخرى إذا كانت الخطوات المذكورة أعلاه لا تزال لا تعمل في قضيتك.

لقد جربت أيضًا ما يلي على server.js (العقدة) وما زلت لا تعمل ، لذلك لا تهتم بالمحاولة:

var app = express();
var cors = require('cors'); // Already done “npm i cors --save-dev”
app.options('*', cors());

عندما قمت بتحديث Chrome كنت أواجه المشكلة ، قمت بحلها في Google Extension "Access-Control-Callereds" إصدار جديد. إذا كان إصدارًا قديمًا ، فلن تحتاج إلى العمل على إصدار Google Chrome جديد

https://chrome.google.com/webstore/detail/access-control-allow-cred/hmcjjmkppmkpobeokkhgkecjlaobjldi؟hl=en

تحقق من التأكد من أنك لم تقم بتعيين الخادم الخاص بك للسماح ببيانات الاعتماد وتعيين رأس السماح بالأصل إلى *. مثل أدناه:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

إذا كان الخادم الخاص بك يعيد هذه القيم لهذه الرؤوس ، فلن يعمل. إذا قمت بتعيين Access-Control-Allow-Credentials إلى true, ، ثم لا يمكنك استخدام *كقيمة Access-Control-Allow-Origin رأس. فيما يلي مقتطف من MDN WebDocs للرأس (https://developer.mozilla.org/en-us/docs/web/http/headers/access-control-allow-origin):

For requests without credentials, the literal value "*" can be specified, as a wildcard; 
the value tells browsers to allow requesting code from any origin to access the resource. 
Attempting to use the wildcard with credentials will result in an error.

إذا كان ما سبق هو الحال ، فما عليك سوى ضبط Access-Control-Allow-Credentials إلى false.

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: false

مراجع

سوف يعمل cors في الكروم. ما عليك سوى استخدام Chrome هو وضع آمن ، أي استخدام إعدادات الأمان. Google حول هذا الموضوع ، أو يمكنك حتى البدء من سطر الأوامر أيضًا.

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