javascript - الأصل غير مسموح به بواسطة Access-Control-Allow-Origin




ajax xmlhttprequest (15)

أقوم بإجراء Ajax.request إلى خادم PHP عن بعد في تطبيق Sencha Touch 2 (ملفوفة في PhoneGap ).

الرد من الخادم هو ما يلي:

لا يمكن تحميل XMLHttpRequest http://nqatalog.negroesquisso.pt/login.php . مصدر http://localhost:8888 غير مسموح به بواسطة Access-Control-Allow-Origin.

كيف يمكنني حل هذه المشكلة؟


إذا لم يكن لديك التحكم في الخادم ، فيمكنك ببساطة إضافة هذه الوسيطة إلى --disable-web-security Chrome: --disable-web-security .

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

واحد الذي تستخدمه Phonegap لبناء التطبيق بالفعل وتحميله على الجهاز ، وهذا لن يكون مشكلة.


إذا حصلت على هذا في Angular.js ، فتأكد من الخروج من رقم المنفذ الخاص بك على النحو التالي:

var Project = $resource(
    'http://localhost\\:5648/api/...', {'a':'b'}, {
        update: { method: 'PUT' }
    }
);

انظر here لمزيد من المعلومات حول هذا الموضوع.


إذا كنت تحت apache ، فقط أضف ملف .htaccess إلى دليلك مع هذا المحتوى:

مجموعة الرأس Access-Control-Allow-Origin: *

تعيين رأس Access-Control-Allow-Headers: نوع المحتوى

مجموعة رأسية Access-Control-Allow-Methods: *


إذا كنت تستخدم Apache ، فما عليك سوى إضافة:

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>

في التكوين الخاص بك. سيؤدي ذلك إلى إمكانية الوصول إلى جميع الردود الواردة من خادم الويب من أي موقع آخر على الإنترنت. إذا كنت تنوي السماح باستخدام الخدمات على مضيفك فقط من خلال خادم معين ، فيمكنك استبدال * بعنوان URL للخادم الأصلي:

Header set Access-Control-Allow-Origin: http://my.origin.host


إذا كنت تكتب إضافة Chrome وتلقيت هذا الخطأ ، فتأكد من أنك أضفت عنوان URL الأساسي الخاص بـ API إلى كتلة أذونات manifest.json ، على سبيل المثال:

"permissions": [
    "https://itunes.apple.com/"
]

سأقدم لك حلا بسيطا لهذا. في حالتي لا أستطيع الوصول إلى الخادم. في هذه الحالة ، يمكنك تغيير سياسة الأمان في متصفح Google Chrome للسماح بـ Access-Control-Allow-Origin. هذا بسيط جدا:

  1. أنشئ اختصارًا لمتصفح Chrome
  2. انقر بزر الماوس الأيمن فوق رمز اختصار -> خصائص -> اختصار -> الهدف

معجون بسيط في "C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security .

قد يختلف الموقع. الآن افتح Chrome من خلال النقر على هذا الاختصار.


عندما تتلقى الطلب ، يمكنك ذلك

var origin = (req.headers.origin || "*");

من عندما تضطر للرد مع شيء من هذا القبيل:

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    }
);

في روبي سيناترا

response['Access-Control-Allow-Origin'] = '*' 

للجميع أو

response['Access-Control-Allow-Origin'] = 'http://yourdomain.name' 

قد يكون هذا مفيدًا لأي شخص يحتاج إلى استثناء لإصدارات "www" و "non-www" من المُحيل:

 $referrer = $_SERVER['HTTP_REFERER'];
 $parts = parse_url($referrer);
 $domain = $parts['host'];

 if($domain == 'google.com')
 {
         header('Access-Control-Allow-Origin: http://google.com');
 }
 else if($domain == 'www.google.com')
 {
         header('Access-Control-Allow-Origin: http://www.google.com');
 }

كتبت مقالا حول هذه المسألة مرة أخرى ، عبر المجال أجاكس .

إن أسهل طريقة للتعامل مع هذا إذا كان لديك تحكم في الخادم المُجيب هو إضافة رأس استجابة لما يلي:

Access-Control-Allow-Origin: *

سيسمح هذا عبر المجال Ajax . في PHP ، ستحتاج إلى تعديل الرد كما يلي:

<?php header('Access-Control-Allow-Origin: *'); ?>

يمكنك فقط Header set Access-Control-Allow-Origin * في إعداد Apache أو ملف htaccess. انها تعمل فقط مثل السحر.

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


لا يعد حرف البدل خيارًا آمنًا للغاية. كنت تريد أن تكون أكثر تحديدًا - الخروج من الإجابة التي كتبتها هنا حول نفس السؤال ؛ كيفية تجاوز Access-Control-Allow-Origin؟


لقد واجهت هذا عدة مرات عند العمل مع واجهات برمجة التطبيقات المختلفة. غالبًا ما يكون الإصلاح السريع هو إضافة "& callback =؟" إلى نهاية سلسلة. في بعض الأحيان ، يجب أن يكون رمز العطف رمزًا للحرف ، وأحيانًا يكون "؟": "؟ callback =؟" (راجع استخدام API Forecast.io مع jQuery )


هذا بسبب سياسة الأصل نفسه . انظر المزيد في Mozilla Developer Network أو Wikipedia .

بشكل أساسي ، في المثال الخاص بك ، تحتاج إلى تحميل صفحة http://nqatalog.negroesquisso.pt/login.php فقط من nqatalog.negroesquisso.pt ، وليس localhost .


 **Add this meta tag in your Webservice**


 header('Content-type: application/json');
 header('Access-Control-Allow-Origin: *');




cross-domain