कॉर्स - 'प्रीफ्लाइट' को कैसे एक बेहतर समझा जा सकता है?


94

मैं डब्ल्यूसीएफ सेवा (जो मेरे खुद का है) से क्रॉस डोमेन एचटीटीपी अनुरोध करने की कोशिश कर रहा हूं। मैंने क्रॉस डोमेन स्क्रिप्टिंग सीमाओं के साथ काम करने के लिए कई तकनीकों को पढ़ा है। क्योंकि मेरी सेवा को GET और POST दोनों अनुरोधों को समायोजित करना चाहिए, मैं कुछ डायनेमिक स्क्रिप्ट टैग को लागू नहीं कर सकता, जिसका src एक GET अनुरोध का URL है। चूँकि मैं उस सर्वर पर बदलाव करने के लिए स्वतंत्र हूं, जिसे मैंने "एक्सेस-कंट्रोल-एलाउंस-ओरिजिन" हेडर और ऑप्शन्स रिक्वेस्ट के साथ '' एक्सेस-कंट्रोल-ऑरिज-ऑरिजन '' और 'रिक्वेस्ट' को शामिल करने के लिए सर्वर रिस्पॉन्स को कॉन्फ़िगर करने के लिए एक वर्कअराउंड को लागू करने की कोशिश शुरू की है। मुझे इस पद का विचार मिला: कोसिंग वर्किंग

सर्वर की ओर, मेरी वेब विधि HTTP प्रतिसाद के लिए 'एक्सेस-कंट्रोल-अलाउंस-ओरिजिन: *' जोड़ रही है। मैं देख सकता हूं कि प्रतिक्रियाओं में यह हेडर अभी शामिल है। मेरा प्रश्न है: मैं एक अनुरोध (विकल्प) को कैसे 'पूर्व-प्रकाशित' करूँ? मैं GET अनुरोध करने के लिए jQuery.getJSON का उपयोग कर रहा हूं लेकिन ब्राउज़र कुख्यात के साथ अनुरोध को तुरंत रद्द कर देता है:

उत्पत्ति http: // लोकलहोस्ट को एक्सेस-कंट्रोल-अनुमति-उत्पत्ति द्वारा अनुमति नहीं है

क्या कोई इस CORS तकनीक से परिचित है? मेरे अनुरोध को प्रीफ़्लाइट करने के लिए क्लाइंट में क्या परिवर्तन किए जाने की आवश्यकता है?

धन्यवाद!

जवाबों:


158

प्रीफ़्लाइट अनुरोध के दौरान, आपको निम्नलिखित दो हेडर देखने चाहिए: एक्सेस-कंट्रोल-रिक्वेस्ट-मेथड एंड एक्सेस-कंट्रोल-रिक्वेस्ट-हेडर्स। ये अनुरोध हेडर वास्तविक अनुरोध करने के लिए सर्वर से अनुमति मांग रहे हैं। काम के लिए वास्तविक अनुरोध के लिए इन हेडर प्रतिक्रिया को इन हेडर को स्वीकार करने की आवश्यकता है।

उदाहरण के लिए, मान लीजिए कि ब्राउज़र निम्नलिखित हेडर के साथ एक अनुरोध करता है:

Origin: http://yourdomain.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header

आपके सर्वर को तब निम्न हेडर के साथ जवाब देना चाहिए:

Access-Control-Allow-Origin: http://yourdomain.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: X-Custom-Header

एक्सेस-कंट्रोल-अनुमति-हेडर्स प्रतिक्रिया हेडर पर विशेष ध्यान दें। इस हेडर का मान एक्सेस-कंट्रोल-रिक्वेस्ट-हेडर्स अनुरोध हेडर में एक ही हेडर होना चाहिए, और यह '*' नहीं हो सकता है।

एक बार जब आप इस प्रतिक्रिया को प्रीफ़लाइट अनुरोध के लिए भेज देते हैं, तो ब्राउज़र वास्तविक अनुरोध करेगा। आप यहां CORS के बारे में अधिक जान सकते हैं: http://www.html5rocks.com/en/tutorials/cors/


क्या आप Access-Control-Allow-Origin में कई डोमेन जोड़ सकते हैं?
बॉटबोट

@botbot आपने शायद अब तक इस पर काम किया है, लेकिन अगर दूसरे सोच रहे हैं कि क्या कर सकते हैंAccess-Control-Allow-Origin: *
स्टीव चैम्बर्स

2
मुझे संभवतः कुछ याद आ गया। तो क्या मुझे दो XMLHttp अनुरोध भेजने चाहिए? प्रीफ़्लाइट के लिए एक; सफलता पर प्रतिक्रिया की जाँच करें और फिर वास्तविक क्वेरी भेजें?
कंचन

14
@ कोंकण आपको प्रीफ़लाइट अनुरोध भेजने के बारे में चिंता करने की आवश्यकता नहीं है। यदि अनुरोध को प्रीफ़्लाइट की आवश्यकता है, तो ब्राउज़र इसे आपके लिए भेज देगा।
मोनसुर

4
आप 'विशेष ध्यान' बिट के लिए धन्यवाद ... कि नोड / एक्सप्रेस के साथ अपने मुद्दे को हल मैं इन preflight अनुरोधों को पकड़ने के लिए एक फिल्टर जोड़ने में सक्षम था//cors and preflight filtering app.all('*', function(req, res, next){.. //preflight needs to return exact request-header res.set('Access-Control-Allow-Headers', req.headers['access-control-request-headers']); if ('OPTIONS' == req.method) return res.send(204);next(); });
Kurtfm

0

हालांकि यह धागा 2014 तक वापस आता है, फिर भी यह मुद्दा हम में से कई के लिए वर्तमान हो सकता है। यहाँ मैं एक jQuery 1.12 / PHP 5.6 संदर्भ में इसके साथ कैसे निपटा:

  • jQuery ने केवल सीमित हेडर का उपयोग करके अपना XHR अनुरोध भेजा; केवल 'मूल' भेजा गया था।
  • किसी भी प्रीफ़लाइट अनुरोध की आवश्यकता नहीं थी।
  • सर्वर को केवल इस तरह के अनुरोध का पता लगाना था, और "प्रवेश-नियंत्रण-अनुमति-उत्पत्ति:" जोड़ें। $ _SERVER ['HTTP_ORIGIN'] शीर्षलेख, यह पता लगाने के बाद कि यह एक क्रॉस-उत्पत्ति XHR था।

PHP कोड नमूना:

if (!empty($_SERVER['HTTP_ORIGIN'])) {
    // Uh oh, this XHR comes from outer space...
    // Use this opportunity to filter out referers that shouldn't be allowed to see this request
    if (!preg_match('@\.partner\.domain\.net$@'))
        die("End of the road if you're not my business partner.");

    // otherwise oblige
    header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
}
else {
    // local request, no need to send a specific header for CORS
}

विशेष रूप से, जोड़ने के exit;रूप में कोई preflight जरूरत नहीं है।

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