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


93

मैं एक समाचार वेबसाइट का फ़ीड लाने की कोशिश कर रहा हूं। सोचा था कि मैं फीडबर्नर फ़ीड को जोंस में बदलने के लिए Google के फ़ीड एपीआई का उपयोग करूंगा। निम्नलिखित यूआरएल फ़ीड से 10 पोस्ट लौटाएगा, json प्रारूप में। http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi

उपरोक्त यूआरएल की सामग्री प्राप्त करने के लिए मैंने निम्नलिखित कोड का उपयोग किया

$.ajax({
  type: "GET",
  dataType: "jsonp",
  url: "http://ajax.googleapis.com/ajax/services/feed/load",
  data: {
    "v": "1.0",
    "num": "10",
    "q": "http://feeds.feedburner.com/mathrubhumi"
  },
  success: function(result) {
    //.....
  }
});

लेकिन यह काम नहीं कर रहा है और मुझे निम्नलिखित त्रुटि मिल रही है

XMLHttpRequest http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http%3A%2F%2Ffeeds.feedferer.com%2Fmathrubhumi लोड नहीं किया जा सकता । अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। उत्पत्ति ' http: // localhost ' इसलिए पहुँच की अनुमति नहीं है।

मैं यह कैसे तय करुं?


1
मैंने यहां आपके कोड का परीक्षण किया, क्रोम के साथ और अपेक्षित रूप से काम किया। क्या आपने "crossDomain: true" विशेषता का उपयोग करने की कोशिश की है?
डैनियल लौरेइरो

मैंने आपके कोड को यहां होस्ट किया है: learnwithdaniel.com/test.html । देखें कि क्या आप त्रुटियों के बिना खोल सकते हैं। यदि आपको कोई त्रुटि नहीं मिलती है, तो समस्या आपके सर्वर के साथ है
डैनियल लौरेइरो

महान। तो इसका संबंध उन हेडर से है, जो आप तब भेजते हैं जब आपका ब्राउज़र इस html के लिए अनुरोध करता है। "कॉर्स हेडर्स" के लिए जांचें
डैनियल लौरेइरो

वही यहाँ देवी आपी के साथ
गिलसन गिल्बर्ट

क्या यह प्रश्न दोहराव नहीं है? stackoverflow.com/questions/20035101/… और अधिक महत्वपूर्ण बात, इस अन्य प्रश्न में स्पष्ट / अधिक गहन उत्तर हैं।
लाल मटर

जवाबों:


85

मेरा मानना ​​है कि यह संभावना हो सकती है कि क्रोम - क्रोम मुद्दे को देखने केlocalhost माध्यम से जाने के लिए समर्थन न करेAccess-Control-Allow-Origin

Access-Control-Allow-Originहैडर में क्रोम भेजने के लिए, बस अपने लोकलहोस्ट को अपने / आदि / होस्ट्स फ़ाइल में किसी अन्य डोमेन पर उर्फ ​​करें, जैसे:

127.0.0.1   localhost yourdomain.com

फिर अगर आप yourdomain.comइसके बजाय अपनी स्क्रिप्ट का उपयोग करेंगे localhost, तो कॉल सफल होनी चाहिए।


धन्यवाद। मैं इस समस्या का सामना कर रहा था और IE किनारे पर स्विच कर रहा था, जिससे मुझे अपने सर्वर कोड में अंतर्निहित त्रुटि दिखाई दे रही थी जो क्रोम द्वारा स्थानीयहोस्ट के इनकार से अस्पष्ट हो रही थी।
एलुआन हद्दाद

7
मेरे लिए भी काम नहीं करता है। शायद Chrome के अपडेट ने इस "लूपहोले" को अवरुद्ध कर दिया है?
मार्टी सी।

2
यहां भी कोई मदद नहीं मिली। मेरी वेबसाइट पहले से ही इस तरह से स्थापित है, हालांकि मेरे पास एक बड़ा अंतर है। मैं एक अलग पोर्ट का उपयोग कर रहा हूं। मुझे यकीन है कि अगर यह वही बंदरगाह होता, तो यह काम करता। HTTP बनाम HTTPS बेशक अलग-अलग पोर्ट हैं, जिससे आप में से कुछ समस्याएँ हो सकती हैं। खदान विशेष रूप से HTTPS नहीं है, लेकिन मैं एक ही डोमेन पर कुछ का उपयोग करने की कोशिश कर रहा हूं, लेकिन 80 के अलावा एक अलग बंदरगाह।
जेरी डॉज

अगर एपीआई को क्रोम एक्सटेंशन द्वारा एक्सेस किया जा रहा है, तो क्या किया जा सकता है
viveksinghggits

111

यदि आप Google Chrome ब्राउज़र का उपयोग करते हैं तो आप एक्सटेंशन के साथ हैक कर सकते हैं।

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

आप अपने ऐप को एक स्थानीय मशीन (यदि उत्पादन में सब कुछ काम करता है) पर डिबगिंग के लिए इसका उपयोग कर सकते हैं।

सूचना : यदि URL टूट जाता है तो एक्सटेंशन नाम Access-Control-Allow-Origin: * हो जाता है । जब आप अपने सामान पर काम नहीं कर रहे हैं, तो मैं आपको इस एक्सटेंशन को अक्षम करने की सलाह देता हूं, क्योंकि, उदाहरण के लिए, इस एक्सटेंशन के साथ youtube काम नहीं करता है।


यह निश्चित रूप से मेरे लिए भी काम करता है! ... मुझे लगता है कि प्लगइन के डेवलपर ने इसे अपडेट करने के लिए मैन्युअल रूप से काम करने के बजाय कुछ निश्चित यूआरएल फिट करने के लिए अपडेट किया है, मैंने Youtube और अन्य साइटों का दौरा किया और यह ठीक काम करता है। वैसे भी बहुत बहुत धन्यवाद।
किंग्सटन फॉर्च्यून

1
यह केवल विकास के दौरान परीक्षण के लिए है। उपयोगकर्ता ब्राउज़र में प्लगइन जोड़ने नहीं जा रहे हैं
कैप्शन न्यूटन

ऐसा लगता है कि एक्सटेंशन अब उपलब्ध नहीं है, कम से कम उस URL पर है। हालाँकि, यह एक्सटेंशन काम करता प्रतीत होता है: chrome.google.com/webstore/detail/allow-cors-access-control/…
गॉर्डन

लेकिन यह विस्तार क्या कर रहा है ? क्या आप एक ओपन-सोर्स संस्करण के बारे में जानते हैं या ऐसा लिखने के लिए क्या करना है जो हेडर को इस तरह से संशोधित करता है? आप शायद नहीं चाहते हैं (ठीक है, ठीक है, मैं नहीं चाहता) एक एक्सटेंशन चलाना जो कि यह क्या कर रहा है, यह जानने के बिना URL और डेटा तक पूरी पहुंच है। लगता है कि जैसे एक हो सकता है बहुत बुरा विचार विस्तार हाथ बदल जाता है, पहले से ही नापाक है अगर, आदि संपादित करें: एक नीचे उल्लेख है खुला स्रोत , Fwiw।
रफिन

9

इसे आज़माएं - हेडर को इस प्रकार सेट करके अजाक्स कॉल सेट करें:

var uri = "http://localhost:50869/odata/mydatafeeds"
$.ajax({
    url: uri,
    beforeSend: function (request) {
        request.setRequestHeader("Authorization", "Negotiate");
    },
    async: true,
    success: function (data) {
        alert(JSON.stringify(data));
    },
    error: function (xhr, textStatus, errorMessage) {
        alert(errorMessage);
    }                
});

फिर निम्न कमांड लाइन के साथ क्रोम खोलकर अपना कोड चलाएं:

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

1

सिर्फ FYI करें, मैंने इस जानकारी को jQuery प्रलेखन से देखा है जो मेरा मानना ​​है कि इस मुद्दे पर लागू होता है:

ब्राउज़र सुरक्षा प्रतिबंधों के कारण, अधिकांश "अजाक्स" अनुरोध एक ही मूल नीति के अधीन हैं ; अनुरोध किसी भिन्न डोमेन, उपडोमेन, पोर्ट या प्रोटोकॉल के डेटा को सफलतापूर्वक पुनर्प्राप्त नहीं कर सकता है।

@Thanix जैसी मेजबानों फ़ाइल को बदलने से मेरे लिए काम नहीं किया गया, लेकिन @dkruchok द्वारा बताए गए विस्तार ने समस्या को हल कर दिया।


0

Chrome आपको दो अलग-अलग लोकलहोस्ट को एकीकृत करने की अनुमति नहीं देता है, इसीलिए हमें यह त्रुटि मिल रही है। आपको बस Microsoft Visual Studio Web Api Core पैकेज को nuget manager से शामिल करना है। और अपनी WebApiConfig.cs फ़ाइल में WebApi प्रोजेक्ट के कोड की दो पंक्तियाँ जोड़ें ।

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

फिर सब हो गया।


स्पष्ट रूप से यह केवल डॉटनैट कोर बैकेंड के लिए लागू होता
अफसोस

0

यदि इसकी कॉलिंग स्प्रिंग बूट सेवा है। आप इसे नीचे दिए गए कोड का उपयोग करके संभाल सकते हैं।

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS")
                    .allowedHeaders("*", "Access-Control-Allow-Headers", "origin", "Content-type", "accept", "x-requested-with", "x-requested-by") //What is this for?
                    .allowCredentials(true);
        }
    };
}

0

विकास के लिए आप https://cors-anywhere.herokuapp.com का उपयोग कर सकते हैं , उत्पादन के लिए अपना प्रॉक्सी सेट करना बेहतर है

async function read() {
   let r= await (await fetch('https://cors-anywhere.herokuapp.com/http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi')).json();
   console.log(r);
}

read();


0

CORS अनब्लॉक कार्यों के लिए क्रोम 78 [UNB CORS] महान [1] https://chrome.google.com/webstore/detail/cors-unblock/lfhmikememgdcahcdlaciloancbhjino

यह "क्रोम अनब्लॉक" नामक Google क्रोम के लिए एक प्लगइन है

सारांश: 'एक्सेस-कंट्रोल-अलाउंस-ओरिजिन: *' शीर्षक द्वारा स्थानीय और दूरस्थ वेब अनुरोधों को सक्षम करते समय कोई और कोर त्रुटि

यह एक्सटेंशन कस्टम "एक्सेस-कंट्रोल-अलाउंस-ओरिजिन-ओरिजिनल" और "एक्सेस-कंट्रोल-कंट्रोल-अलाउंस-मेथड्स" हेडर को हर रिक्वेस्ट जो ब्राउजर को प्राप्त होता है, प्रदान करके नियंत्रण प्रदान करता है। एक उपयोगकर्ता टूलबार बटन से एक्सटेंशन को चालू और बंद कर सकता है। इन हेडर को कैसे बदला जाता है, इसे संशोधित करने के लिए, राइट-क्लिक करें संदर्भ मेनू आइटम का उपयोग करें। आप अनुकूलित कर सकते हैं कि किस विधि की अनुमति है। डिफ़ॉल्ट विकल्प 'GET', 'PUT', 'POST', 'DELETE', 'HEAD', 'विकल्प', 'PATCH' विधियों की अनुमति है। जब सर्वर पहले से ही इन्हें भरता है तो आप एक्सटेंशन से इन हेडर को न लिखने के लिए भी कह सकते हैं।


0

ठीक है, दूसरा तरीका यह है कि cors प्रॉक्सी का उपयोग करें, आपको बस अपने URL.so से पहले https://cors-anywhere.herokuapp.com/ जोड़ना होगा। आपका URL https://cors-anywhere.herokuapp.com/http जैसा होगा। : //ajax.googleapis.com/ajax/services/feed/load

प्रॉक्सी सर्वर उपरोक्त URL से http://ajax.googleapis.com/ajax/services/feed/load प्राप्त करता है। फिर यह उस सर्वर की प्रतिक्रिया प्राप्त करने के लिए अनुरोध करता है। और अंत में, प्रॉक्सी लागू होता है

Access-Control-Allow-Origin: *

उस मूल प्रतिक्रिया के लिए।

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

आप कॉर्स त्रुटि को ठीक करने के लिए मध्यम 3 तरीकों पर समाधान के बारे में अधिक पढ़ सकते हैं


-5

का उपयोग करें @CrossOriginपर backendsideस्प्रिंग बूट नियंत्रक (या तो श्रेणी स्तर या विधि स्तर) क्रोम त्रुटि के लिए समाधान के रूप में में 'No 'Access-Control-Allow-Origin'हैडर अनुरोध किया गया संसाधन पर मौजूद है। '

यह समाधान मेरे लिए 100% काम कर रहा है ...

उदाहरण: कक्षा स्तर

@CrossOrigin
@Controller
public class UploadController {

----- या -------

उदाहरण: विधि का स्तर

@CrossOrigin(origins = "http://localhost:3000", maxAge = 3600)
@RequestMapping(value = "/loadAllCars")
    @ResponseBody
    public List<Car> loadAllCars() {


Ref: https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

हालांकि यह निश्चित रूप से ओपी के सवाल का जवाब नहीं देता है, लेकिन इसके पास एक वैध बिंदु है। जावास्क्रिप्ट के माध्यम से स्प्रिंग रेस्टफुल सर्विसेज / डेटा का उपभोग करने के लिए आपको @CrossOriginएनोटेशन सेट करने की आवश्यकता होती है । उन सभी के लिए जो नीचा दिखाते हैं: कृपया अपने कारण बताएं!
rwenz3l
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.