2012-03-08 30 views
5

मैं क्लाइंट पर jQuery (1.7.1) संचालित AJAX का उपयोग करके सरल क्रॉस-ओरिजिनल रिसोर्स शेयरिंग सेट अप करने की कोशिश कर रहा हूं और अपाचे ने पाइथन (डीजेंगो) सर्वर परोस दिया है। सभी निर्देशों के अनुसार मैंने पढ़ लिया है मेरी हेडर सही ढंग से स्थापित कर रहे हैं, लेकिन मैं निम्नलिखित त्रुटि मिलती रहती है:सही हेडर के बावजूद CORS एक्सेस-कंट्रोल-अनुमति-उत्पत्ति

XMLHttpRequest cannot load http://myexternaldomain.com/get_data . Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin.

हैडर जा रहा है मैं कोशिश कर रहा हूँ (मुझे यकीन है कि यह और भी ब्राउज़र अतीत हो रही है नहीं कर रहा हूँ) भेज है:

Request URL:http://myexternaldomain.com/get_data 
Accept:application/json, text/javascript, */*; q=0.01 
Origin:http://localhost:8080 
Referer:http://localhost:8080/static/js/test-zetta.html 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 

जावास्क्रिप्ट कोड origin ठीक से सेट है

var request = $.ajax({ 
     url : "http://myexternaldomain.com/get_data", 
     type : "POST", 
     dataType : "json", 
     crossDomain : true 
    }); 

ध्यान दें कि है। सर्वर ने निम्न अजगर कोड

def process_response(self, response): 
    if response.has_header('Access-Control-Allow-Origin'): 
      return response 

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

def get_orders(request): 
    """ Tell worker what to do """ 
    response_data = {} 
    response_data['action'] = 'probe' 
    response = process_response(HttpResponse(json.dumps(response_data), mimetype="application/json")) 
    return response 

अगर मैं पता सीधे जाएं, यह पुष्टि करने के लिए शीर्ष लेख सही ढंग से क्रॉस-डोमेन में सेट किया जा रहा है कि

Access-Control-Allow-Origin:* 
Content-Type:application/json 
Date:Thu, 08 Mar 2012 05:06:25 GMT 
Server:Apache/2.2.20 (Ubuntu) 
Transfer-Encoding:chunked 

हालांकि यह स्थापित करने के लिए प्रकट होता है का उपयोग करते हुए शीर्ष लेख Access-Control-Allow-Origin = * कहते हैं हमेशा विफल रहता है (क्रोम और फ़ायरफ़ॉक्स दोनों की कोशिश की)। मैं this सवाल का वास्तव में चयनित जवाब के अनुसार कोड को लागू करने की कोशिश की है, लेकिन एक ही त्रुटि मिलती है

अद्यतन

मैं काफी यकीन है कि समस्या सर्वर साइड है कर रहा हूँ के रूप में मैं पाने में कामयाब रहे है मेरे AJAX कॉल एक अलग सार्वजनिक CORS सक्षम सर्वर के साथ काम कर कॉल। जब मैं इस सार्वजनिक सर्वर से वापस आने वाले शीर्षकों की तुलना करता हूं, और मेरे द्वारा लौटाए गए (जब मैं एक ही डोमेन से परीक्षण करता हूं), तो मुझे कोई बड़ा अंतर नहीं दिखाई दे सकता है जो अंतर के लिए खाता हो सकता है (नीचे देखें)।

एक सूक्ष्मता जिसे मैंने बाहर रखा है, जो महत्वपूर्ण हो सकता है या हो सकता है कि वास्तविक डोमेन एकाधिक सबडोमेन का एक अमेज़ॅन डोमेन है। वास्तविक पताhttp://ec2-23-20-27-108.compute-1.amazonaws.com/get_orders है, यह देखने के लिए स्वतंत्र महसूस करें कि मैं क्या गलत कर रहा हूं।

सार्वजनिक सर्वर

Access-Control-Allow-Origin:* 
Connection:Keep-Alive 
Content-Encoding:gzip 
Content-Length:622 
Content-Type:text/html 
Date:Thu, 08 Mar 2012 15:33:20 GMT 
Keep-Alive:timeout=15, max=99 
Server:Apache/2.2.14 (Ubuntu) 
Vary:Accept-Encoding 
X-Powered-By:Perl/5.8.7, PHP/4.4.0 

अपने सर्वर से से -

Access-Control-Allow-Origin:* 
Content-Encoding:gzip 
Content-Type:text/plain 
Date:Thu, 08 Mar 2012 15:32:24 GMT 
Server:Apache/2.2.20 (Ubuntu) 
Transfer-Encoding:chunked 
Vary:Accept-Encoding 
+1

मैंने अतीत में, जेसन डेटा के लिए सीओआरएस सक्षम करने और कभी सफल नहीं होने की कोशिश की है। सीओआरएस इस तरह flaky हो सकता है। आप बस JSON-P लौटने से बेहतर होगा। – xbonez

+0

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

उत्तर

5

तो मैं यूआरएल पर जाने से प्रतिक्रिया से गुमराह हो रहा था, और वास्तव में समस्या यह थी कि AJAX अनुरोध करते समय, मुझे 403 मिल रहा था (केवल प्रकट हुआ फ़ायरफ़ॉक्स में क्रोम नहीं) सीएसआरएफ सुरक्षा के कारण त्रुटि।

+1

ओह मैन, बहुत बहुत धन्यवाद। मेरे पास '' csrf_exempt' wrapper के आस-पास मेरा 'enable_cors' wrapper था, जो उन्हें उलट करने के लिए आवश्यक था। मैं डब्ल्यूटीएफ की तरह था ... – orokusaki

5

(क्रॉस-डोमेन काम नहीं कर) आप एक "पूर्व flighted" अनुरोध और प्रतिक्रिया को लागू करने की है, क्योंकि अपने स्थिति "not so simple" अनुरोध के रूप में गिना जाता है। मूल कोर, केवल मूल हेडर की आवश्यकता होती है, केवल "एप्लिकेशन/एक्स-www-form-urlencoded", "मल्टीपार्ट/फॉर्म-डेटा", और "टेक्स्ट/सादा" के सामग्री प्रकार हो सकते हैं। चूंकि आप "एप्लिकेशन/जेसन" वापस लौटते हैं, इसलिए आप इस आवश्यकता को पूरा नहीं करते हैं।

मुझे Django के बारे में कुछ भी पता नहीं है, लेकिन मुझे Tomcat filter के उपयोग के माध्यम से मेरे आवेदन के बाहर सीओआरएस समर्थन को कार्यान्वित करना आसान लगता है। ऐसा लगता है कि आप Django के साथ do the same thing कर सकते हैं।

2013-08-11: ऐसा लगता है कि गिटहब रेपो अब हमारे साथ नहीं है।लेकिन Django पैकेज अभी भी https://pypi.python.org/pypi/django-cors/0.1

+0

बहुत यकीन है कि ब्राउजर को प्रीफलाइट अनुरोध का ख्याल रखना चाहिए .... कम से कम क्रोम करता है। –

+0

लेकिन सर्वर को इसे पहचानना है। उनकी स्क्रिप्ट केवल प्रत्येक अनुरोध के लिए मूल शीर्षलेख जोड़कर मूल अनुरोधों का जवाब देती है। –

+0

मैंने अपने डेटा को एक साधारण स्ट्रिंग करके, $ .ajax कॉल में सादा पाठ की उम्मीद करके और पायथन में mimetype = 'text/plain' लौटने के अनुरोध को सरल बनाने का प्रयास किया, लेकिन फिर भी वही त्रुटियां मिलती हैं। – zenna

2

मैं उत्कृष्ट django-cors-headers लाइब्रेरी का उपयोग कर रहा था और इस समस्या में भी भाग गया। मेरे लिए, समाधान 'स्वीकार-एन्कोडिंग' को डिफ़ॉल्ट CORS_ALLOW_HEADERS tuple में जोड़ना था।