2014-09-18 13 views
16

मैं एक AngularJS/Cordova एप्लिकेशन जो चुनाव एक दूरस्थ सर्वर पर एक JSON सेवा:

$http({method: 'GET', url: 'http://example.com/index.php'}) 

ब्राउज़र में विकास और बंद चल रहा है मेरी इंट्रानेट अपाचे सर्वर (http://dev) मैं "नहीं 'पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति' शीर्षक मौजूद है" इसलिए मैं इस जोड़कर तय:

Header set Access-Control-Allow-Origin "http://dev" 

सभी ठीक काम करता है, और मैं अपने क्रोम देव उपकरणों में Origin:http://dev देखते हैं।

तो, इस बारे में पहली बार सोचने के लिए, मुझे आश्चर्य है कि ऐप एंड्रॉइड/आईओएस वेबव्यू में ऐप कब होगा। मैं अपने उपकरणों पर निर्माण और तैनाती करने का निर्णय लेता हूं और रिमोट डीबगिंग (आईओएस के लिए सफारी और एंड्रॉइड के लिए वेनरे) में एक ही त्रुटि देखने की उम्मीद करता हूं, लेकिन मेरे आश्चर्य के लिए यह काम करता है (बिना किसी कोरर्स हेडर भेजने के)! मुझे यह भी लगता है कि दोनों डिवाइसों में ऐप फोन ओएस द्वारा प्रदान किए गए कुछ प्रकार के http सर्वर के बजाय फ़ाइल: // योजना के तहत वेबव्यू में चलाता है (जिसे मैंने माना)।

तो शोध यह सुझाव देता है कि फ़ाइल के लिए सीओआरएस की आवश्यकता नहीं है: // - ऐसी साइट "किसी भी डोमेन पर किसी भी एक्सएचआर संसाधन का उपयोग कर सकती है। लेकिन, जब मैं डेस्कटॉप ब्राउज़र पर इसका परीक्षण करता हूं तो मुझे लगता है कि सफारी नहीं है फ़ाइल के लिए CORS की जरूरत: // लेकिन क्रोम करता है, और फ़ायर्फ़ॉक्स CORS

बिना किसी भी तरह से काम करता है

तो मेरे सवालों का:

1) क्यों अपने Android/iOS में CORS बिना काम अनुप्रयोग है - यह है, क्योंकि CORS नहीं है फ़ाइल पर लागू करें: //, या, कॉर्डोवा इसे डिवाइस में काम करने के लिए कुछ कर रहा है?

मेरे पास <access origin="*"/> है मेरी कॉन्फ़िगरेशन में

2) यदि, प्रश्न 1 के लंबित उत्तर हैं, तो मुझे सुरक्षित साइट पर होना चाहिए और स्पष्ट रूप से ऐप्स से अनुरोधों की अनुमति देना चाहिए, आप फ़ाइल के लिए एक्सेस-कंट्रोल-अनुमति-उत्पत्ति किस मूल्य को देते हैं: // "होस्ट"? मेरे डीबगिंग में फ़ाइल से अनुरोधों में कोई मूल शीर्षलेख नहीं है: //

3) रिमोट सर्वर पर XHR अनुरोध को अवरुद्ध करने के अलावा, क्रोम भी मेरे ऐप टेम्पलेट्स को अवरुद्ध कर रहा है (मैं अलग-अलग फ़ाइलों का उपयोग कर रहा हूं) निचे देखो। क्या यह मेरे ऐप के साथ एक संभावित समस्या है, या सिर्फ एक क्रोम मुद्दा है जिसके बारे में मुझे चिंता करने की आवश्यकता नहीं है?

XMLHttpRequest cannot load file:///Volumes/projects/phonegap/www/templates/tabs.html. Cross origin requests are only supported for HTTP. 

उत्तर

26

वहाँ CORS हेडर संकेत देने के लिए कि एक क्रॉस-डोमेन एक्सएचआर अनुमति दी जानी चाहिए के लिए दो तरीके हैं:

  • भेजने Access-Control-Allow-Origin: * (सभी मेजबानों की अनुमति देते हैं)
  • मेजबान आप की अनुमति देने के लिए करना चाहते हैं डाल अपने बैकएंड द्वारा Origin हैडर में

file:// यूआरएल के लिए के रूप में वे एक अशक्त उत्पादन करेगाOrigin जिसे दूसरे विकल्प (इको-बैक) के माध्यम से अधिकृत नहीं किया जा सकता है।

mentioned के रूप में:

क्रॉस-डोमेन नीति PhoneGap पर लागू नहीं होता (कई कारणों से, के लिए मूल रूप से है क्योंकि आपके एप्लिकेशन अनिवार्य रूप से फ़ाइल बंद चल रहा है: // यूआरआई ऑन-डिवाइस)।

कृपया ध्यान रखें कि आपको अपने बाहरी डोमेन तक पहुंचने के लिए अपने ऐप्स के लिए श्वेतसूची सेट अप करना होगा।

क्रोम समस्या है, जो डेवलपर कंसोल में देखा जा सकता है के लिए के रूप में:

Failed to load resource: net::ERR_FILE_NOT_FOUND file:///C:/2.html XMLHttpRequest cannot load file:///C:/2.html. Received an invalid response. Origin 'null' is therefore not allowed access.

वहाँ Chromium project's issue tracker, #40787 पर एक चर्चा थी। वे के रूप में समस्याओं को चिह्नित करते हैं को ठीक नहीं करेंगे क्योंकि यह व्यवहार डिज़ाइन द्वारा हो रहा है।

वहाँ के साथ --allow-file-access-from-files --disable-web-security

उदाहरण, एक वैकल्पिक हल केवल विकास प्रयोजनों के लिए क्रोम में CORS बंद करने का प्रस्ताव रखा, शुरू करने क्रोम है - एक सुरक्षा मॉडल है कि बाहर डोमेन तक पहुंच को नियंत्रित करता है

  • CORS and phonegap apps
  • Domain whitelisting in Apache Cordova: विंडोज

    `C:\Users\YOUR_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files --disable-web-security` 
    

    के लिए यहां कुछ और कॉर्डोबा संबंधित जवाब है।

चेक अधिक जानकारी के लिए इन संसाधनों CORS पर:

भी चेक CORS के लिए ब्राउज़र समर्थन:

और रिकॉर्ड formal CORS specification on W3C :)

+0

आपकी प्रतिक्रिया के लिए धन्यवाद के लिए। मैंने वास्तव में आपके द्वारा पोस्ट किए गए अधिकांश लिंक देखे थे। मेरे क्यू 3 के अनुसार, क्रोम मेरे रिमोट सर्वर और टेम्पलेट्स के लिए स्थानीय अनुरोध दोनों को अवरुद्ध कर रहा है, क्या मैं इसे अनदेखा कर सकता हूं और सफारी के साथ काम कर सकता हूं? – KevInSol

+1

@KevInSol मैं क्रोम को अनदेखा कर दूंगा और स्थानीय विकास के लिए सफारी या फ़ायरफ़ॉक्स के साथ काम करूंगा। कृपया उत्तर पर मेरा अंतिम अपडेट देखें - मैंने क्रोमियम डेवलपर्स से चर्चा के लिए एक लिंक शामिल किया है जो उस मुद्दे को चिह्नित करता है क्योंकि उनके लिए ठीक नहीं होगा। – Blaise

+0

धन्यवाद ब्लैज, मैं वास्तव में आईओएस पर रिमोट डीबगिंग की आसानी के लिए पिछले कुछ दिनों में सफारी का उपयोग कर रहा हूं। मैं देखता हूं कि आपके द्वारा पोस्ट किया गया लिंक बहुत पुराना है, लेकिन मुझे लगता है कि स्थिति वही है। आपकी सहायताके लिए धन्यवाद! – KevInSol

संबंधित मुद्दे