अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। उत्पत्ति '...' इसलिए पहुँच की अनुमति नहीं है


135

मैं यूआरएल को फिर से लिखने के लिए .htaccess का उपयोग कर रहा हूं और मैंने इसे काम करने के लिए html बेस टैग का उपयोग किया है।

अब, जब मैं एक अजाक्स अनुरोध करने की कोशिश करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

XMLHttpRequest लोड नहीं किया जा सकता है http://www.example.com/login.php। अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। http://example.comइसलिए मूल ' ' को एक्सेस की अनुमति नहीं है।


1
कोई बात नहीं ... यह अब काम कर रहा है, मुझे यह भी नहीं पता कि गलती क्या थी: एस
Th3lmuu90

8
पूरी तरह से सूक्ष्म, http://wordicious.comएक अलग डोमेन है http://www.wordicious.com/, इस प्रकार त्रुटि। Btw, अगर यह अब काम कर रहा है और अपने आप से वापस मिल गया है, तो आपको शायद प्रश्न को हटा देना चाहिए।
21

@acdcjunior वह त्रुटि प्रतीत होती है, जो आपकी ओर से एक सूक्ष्म अवलोकन है। यदि आप एक उत्तर के रूप में पोस्ट करते हैं तो मैं इसे बढ़ा दूंगा।
वलीद खान

5
यह एक अच्छी बात है कि प्रश्न को नष्ट नहीं किया गया था, या मैंने आज नहीं देखा होगा!
आईकेडवाटर

जवाबों:


170

उपयोग करने के addHeaderबजाय setHeaderविधि का उपयोग करें ,

response.addHeader("Access-Control-Allow-Origin", "*");

*ऊपर लाइन में अनुमति देगा access to all domains


अनुमति के लिए access to specific domain only:

response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");

इसकी जाँच करें blog post


4
यह एडहाइडर को परिभाषित नहीं दिखा रहा है। क्या आप इसे समझा सकते हैं?
वैसाख पीसी

9
मैं इन पंक्तियों को कहाँ रखूँ?
डेववले 16

14
इसे कहां जोड़ा जाना चाहिए?
एलेक्स

1
वह ब्लॉग पोस्ट Node.js और एक्सप्रेस के बारे में बता रहा है। क्लाइंट साइड जावास्क्रिप्ट नहीं। अगर कोई इस काम की पुष्टि कर सकता है?
सैम ईटन

1
मुझे नहीं लगता कि यह कॉन्फ़िगरेशन केवल क्लाइंट साइड पर किया जा सकता है .. इसलिए इसे कहां रखा जाए, यह सर्वर साइड कोड पर होगा (संभवत: अनुरोध का जवाब देते समय)
चिराग रवींद्र

145

त्रुटि क्यों उठाई गई है:

जावा स्क्रिप्ट कोड के द्वारा सीमित है एक ही मूल नीति पर एक पृष्ठ से, जिसका अर्थ है www.example.com, आप केवल (AJAX) में स्थित सेवाओं के लिए अनुरोध कर सकते हैं वास्तव में , एक ही डोमेन वास्तव में उस मामले में www.example.com( नहीं example.com - बिना www- याwhatever.example.com )।

आपके मामले में, आपका अजाक्स कोड एक सेवा http://wordicious.comको एक पृष्ठ पर स्थित से पहुंचने की कोशिश कर रहा है http://www.wordicious.com

यद्यपि बहुत समान हैं, वे समान डोमेन नहीं हैं । और जब वे एक ही डोमेन पर नहीं होते हैं, तो अनुरोध केवल तभी सफल होगा जब लक्ष्य के प्रत्युत्तर में एक Access-Control-Allow-Originहेडर होता है।

अपने पृष्ठ / सेवा के रूप में http://wordicious.com कभी भी ऐसे हेडर को प्रस्तुत करने के लिए कॉन्फ़िगर नहीं किया गया था, उस त्रुटि संदेश को दिखाया गया है।

उपाय:

जैसा कि कहा गया है, मूल (जहां जावास्क्रिप्ट के साथ पृष्ठ है) और लक्ष्य (जहां जावास्क्रिप्ट पहुंचने की कोशिश कर रहा है) डोमेन सटीक होना चाहिए एक ही।

आपका मामला एक टाइपो की तरह लगता है। जैसा दिखता है http://wordicious.comऔर http://www.wordicious.comवास्तव में एक ही सर्वर / डोमेन है। तो ठीक करने के लिए, लक्ष्य और मूल को समान रूप से टाइप करें: आपको अजाक्स कोड अनुरोध पृष्ठ / सेवाओं को http://www.wordicious.comनहीं बनाने के लिएhttp://wordicious.com । (हो सकता है कि लक्ष्य URL को अपेक्षाकृत, जैसे '/login.php'डोमेन के बिना रखें)।



अधिक सामान्य नोट पर:

यदि समस्या एक टाइपो नहीं है जैसे कि यह प्रश्न प्रतीत होता है, तो समाधान लक्ष्य डोमेन में जोड़नाAccess-Control-Allow-Origin होगा । इसे जोड़ने के लिए, निर्भर करता है, ज़ाहिर है, उस पते के पीछे सर्वर / भाषा का। कभी-कभी उपकरण में एक कॉन्फ़िगरेशन चर चाल करेगा। अन्य बार आपको स्वयं कोड के माध्यम से शीर्षलेख जोड़ना होगा।


62

.NET सर्वर के लिए नीचे दिखाए अनुसार web.config में इसे कॉन्फ़िगर कर सकते हैं

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>

उदाहरण के लिए, यदि सर्वर डोमेन http://live.makemypublication.com है और क्लाइंट http://www.makemypublication.com है, तो नीचे दिए गए सर्वर के web.config में कॉन्फ़िगर करें।

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
     </customHeaders>
  </httpProtocol>
 </system.webServer>

इससे भी बेहतर उपाय। धन्यवाद
ANJYR - KODEXPRESSION

बहुत बहुत धन्यवाद। आपने मेरा पूरा दिन बचा लिया।
प्रतीक गुप्ता

2 साल बाद भी काम करना: पी
सर्वव्यापी डेवलपर्स

1
@SyedAliTaqi प्रश्न php है, इसीलिए उत्तर को रेखांकित किया गया है। हालाँकि इसने मेरे लिए भी काम किया :)
अहमद ने

22

यदि आपको यह त्रुटि संदेश ब्राउज़र से मिलता है:

अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। उत्पत्ति '...' इसलिए पहुँच की अनुमति नहीं है

जब आप किसी दूरस्थ सर्वर से Ajax POST / GET अनुरोध करने की कोशिश कर रहे हैं, जो आपके नियंत्रण से बाहर है, तो कृपया इस सरल लिंक के बारे में भूल जाएं:

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

आपको वास्तव में क्या करने की आवश्यकता है, खासकर यदि आप केवल अजाक्स अनुरोध करने के लिए जावास्क्रिप्ट का उपयोग करते हैं, एक आंतरिक प्रॉक्सी है जो आपकी क्वेरी लेता है और इसे दूरस्थ सर्वर के माध्यम से भेजता है।

पहले अपने जावास्क्रिप्ट में, अपने स्वयं के सर्वर पर एक अजाक्स कॉल करें, जैसे कुछ:

$.ajax({
    url: yourserver.com/controller/proxy.php,
    async:false,
    type: "POST",
    dataType: "json",
    data: data,
    success: function (result) {
        JSON.parse(result);
    },
    error: function (xhr, ajaxOptions, thrownError) {
        console.log(xhr);
    }
});

फिर, अपने POST डेटा को लपेटने के लिए प्रॉक्सी.php नामक एक सरल PHP फ़ाइल बनाएं और उन्हें एक पैरामीटर के रूप में दूरस्थ URL सर्वर पर जोड़ें। मैं आपको एक्सपीडिया होटल खोज एपीआई के साथ इस समस्या को कैसे दरकिनार करता हूं, इसका एक उदाहरण देता हूं:

if (isset($_POST)) {
  $apiKey = $_POST['apiKey'];
  $cid = $_POST['cid'];
  $minorRev = 99;

  $url = 'http://api.ean.com/ean-services/rs/hotel/v3/list?' . 'cid='. $cid . '&' . 'minorRev=' . $minorRev . '&' . 'apiKey=' . $apiKey;

  echo json_encode(file_get_contents($url));
 }

ऐसा करके:

 echo json_encode(file_get_contents($url));

आप बस एक ही क्वेरी कर रहे हैं, लेकिन सर्वर की तरफ और उसके बाद, यह ठीक काम करना चाहिए।


@NizarBsb तुम पागल हो तुम जानती हो कि !!!!! : D, बहुत बहुत धन्यवाद आपके उत्तर ने मेरी जान बचाई
Flash


7

आपको विकल्प विधि प्रतिक्रिया में हेडर कीज़ / वैल्यूज़ डालनी होगी। उदाहरण के लिए यदि आपके पास http://mydomain.com/myresource पर संसाधन हैं, तो अपने सर्वर कोड में आप लिखें

//response handler
void handleRequest(Request request, Response response) {
    if(request.method == "OPTIONS") {
       response.setHeader("Access-Control-Allow-Origin","http://clientDomain.com")
       response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
       response.setHeader("Access-Control-Allow-Headers", "Content-Type");
    }



}

3

मूल रूप से अतिरिक्त मापदंडों का पालन करके एपीआई हेडर प्रतिक्रिया को बदल दें।

पहुँच-नियंत्रण-अनुमति-क्रेडेंशियल्स: सच

प्रवेश-नियंत्रण-अनुमति-उत्पत्ति: *

लेकिन जब सुरक्षा की बात आती है तो यह अच्छा समाधान नहीं है


3

वर्कअराउंड अपने 'स्रोत' होस्ट पर चल रहे रिवर्स प्रॉक्सी का उपयोग करना और अपने लक्ष्य सर्वर को अग्रेषित करना है, जैसे कि फ़िडलर:

यहाँ लिंक करें: http://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy

या एक अपाचे रिवर्स प्रॉक्सी ...


क्या यह एक डोमेन के लिए अपाचे या नग्नेक्स कॉन्फिगर स्तर पर किया जा सकता है। उदाहरण के लिए, यदि कोई उपयोगकर्ता mysite.com (कोई www) एक्सेस कर रहा है और XHR www.mysite.com से अनुरोध कर रहा है, तो क्या htaccess या httpd.conf निर्देश इसे हल कर सकता है?
कोडकॉबॉय

निश्चित रूप से, आपके फ्रंट-एंड ऐप को रिवर्स प्रॉक्सी के रूप में व्यवहार करना चाहिए। Apache के लिए, आपको mod_proxy को स्थापित करना होगा, और ProxyPassReverse ( httpd.apache.org/docs/current/mod/… ) का उपयोग करके अपने नियमों को कॉन्फ़िगर करना होगा । इसी तरह की विशेषताओं का लाभ नग्नेक्स
hzrari

2

इसे आप PHP फ़ाइल या मुख्य नियंत्रक में जोड़ें

header("Access-Control-Allow-Origin: http://localhost:9000");

खत्म करने के लिए - आपको भी जरूरत हैheader("Access-Control-Allow-Credentials: true");
एडम

1

Httpd.conf में नीचे प्रविष्टि के साथ हल किया गया

#CORS Issue
Header set X-Content-Type-Options "nosniff"
Header always set Access-Control-Max-Age 1728000
Header always set Access-Control-Allow-Origin: "*"
Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT,PATCH"
Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,Content-Type,Origin,Authentication,Authorization,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control"
Header always set Access-Control-Allow-Credentials true

#CORS REWRITE
RewriteEngine On                  
RewriteCond %{REQUEST_METHOD} OPTIONS 
#RewriteRule ^(.*)$ $1 [R=200,L]
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]

एकमात्र तरीका जिसने मेरे लिए Apache2, CentOS7, Larravel 5 और React
Shakiba Moshiri

0

अनुरोध अनुरोध हेडर स्थापित करने के लिए अनुरोधों में जावास्क्रिप्ट में XMLHTTPREQUEST में उपयोग किए जाने वाले फ़ंक्शन का पता चलता है।

...

xmlHttp.setRequestHeader("Access-Control-Allow-Origin", "http://www.example.com");
...
</script>

संदर्भ: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.