2009-03-16 17 views
44

के बारे में एक प्रश्न मान लें कि मेरे पास मुख्य पृष्ठ http://www.example.com/index.html से लोड किया गया है। उस पृष्ठ पर जेएस कोड है जो http://n1.example.com//echo?message=hello पर AJAX अनुरोध करता है। जब प्रतिक्रिया प्राप्त होती है तो मुख्य पृष्ठ पर एक div प्रतिक्रिया शरीर के साथ अद्यतन किया जाता है।क्रॉस-डोमेन (सबडोमेन) AJAX अनुरोध

क्या यह सभी लोकप्रिय ब्राउज़रों पर काम करेगा?

संपादित करें:

स्पष्ट समाधान www.example.com और n1.example.com के सामने एक प्रॉक्सी रख दिया और यह सेट इतना है कि प्रत्येक अनुरोध http://www.example.com/n1 के subresource के लिए जा रहा http://n1.example.com/ को प्रॉक्सी हो जाता है।

+0

शायद नहीं। ये दो अलग-अलग डोमेन नाम हैं इसलिए ब्राउज़र द्वारा अवरुद्ध क्रॉस-डोमेन अनुरोध। –

उत्तर

17

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

<script type="text/javascript"> 
    function foo(result) { 
    alert(result); 
    } 
</script> 

इसके बजाय आप गतिशील रूप से कुछ इस तरह सम्मिलित हैं:

समारोह परिणाम को संभालने के लिए

<script type="text/javascript" src="http://n1.example.com/echo?callback=foo"></script> 
+0

इसके बारे में जाने का एक दिलचस्प तरीका है ...ठंडा – johnnietheblack

+12

इस तकनीक को JSONP के रूप में जाना जाता है। प्रमुख जावास्क्रिप्ट ढांचे में उनके AJAX पुस्तकालयों में यह क्षमता है। – yfeldblum

+0

ग्रेट वर्कअराउंड! –

1

एक और वैकल्पिक हल, एक php के लिए ajax अनुरोध निर्देशित करने के लिए है (उदाहरण के लिए) अपने डोमेन पर पृष्ठ, और उस पृष्ठ में सबडोमेन को एक कर्ल अनुरोध करें।

133

क्रॉस डोमेन पूरी तरह से एक अलग विषय है। लेकिन क्रॉस सब-डोमेन अपेक्षाकृत आसान है। आपको केवल मूल पृष्ठ और आईफ्रेम पेज दोनों में दस्तावेज़.डोमेन को समान करने के लिए करना है।

document.domain = "yourdomain.com" 

More info here

नोट: इस तकनीक will only let you interact with iframes from parents of your domain। यह XMLHttpRequest द्वारा भेजे गए मूल को बदलता है।

+10

बहुत बुरा "सही" उत्तर चुना गया है जो नहीं है। यह प्रश्न का सही उत्तर है। डोमेन जो दूसरे स्तर के डोमेन (कुछ छोटे अपवादों के साथ) साझा करते हैं, वे हमेशा अपने डोमेन को उप डोमेन साझा करने वाले अन्य डोमेन के बीच व्यापक पहुंच की अनुमति देने के लिए सेट कर सकते हैं। – Jordan

+4

चिंता न करें, यह अभी भी उच्चतम और खोजने के लिए काफी आसान है। stackoverflow महान है। – zod

+11

शायद मैं उलझन में हूं लेकिन उसने आईफ्रेम के बारे में कुछ भी उल्लेख नहीं किया है। क्या यह उत्तर की वैधता को प्रभावित करता है? दूसरे शब्दों में, क्या आप इस विधि का उपयोग कर सकते हैं जब कोई आईफ्रेम नहीं है और शायद हम एक सबडोमेन के बारे में बात कर रहे हैं जो एक अस्थिर एपीआई के रूप में उपयोग किया जा रहा है? (क्रॉस ब्राउज़र) –

1

नया विचार: यदि आप क्रॉस सबडोमेन (www.domain.com और sub.domain.com) चाहते हैं और आप अपाचे पर काम कर रहे हैं। चीजें बहुत आसान हो सकती हैं। यदि सबडोमेन वास्तव में public_html (sub.domain.com = www.domain.com/sub/ में उपनिर्देशिका है। तो अगर आपके पास ajax.domain.com/?request=subject...y आप ऐसा कुछ कर सकते हैं: www .domain.com/ajax /? अनुरोध = एक क्रॉस के लिए समाधान मेरे लिए एक आकर्षण है, और कोई बेवकूफ हैक्स, प्रॉक्सी या मुश्किल चीजों की तरह विषय

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

0

मैंने लिखा । उप डोमेन और मेरे अनुप्रयोगों के लिए अपने काम कर रहा मैं आइफ्रेम और दोनों पक्षों पर = "domain.com" document.domain स्थापित करने के लिए इस्तेमाल किया आप पर मेरे समाधान पा सकते हैं:।

https://github.com/emphaticsunshine/Cross-sub-domain-solution

1

मैंने पाया सबसे सरल समाधान था अपने सबडोमेन पर एक PHP बनाना और एक पूर्ण पथ का उपयोग कर अपनी मूल कार्य फ़ाइल को शामिल करना था।

उदाहरण:

www.domain.com/ajax/this_is_where_the_php_is_called।php

उपडोमेन:

sub.domain.com

बनाएँ: sub.domain.com/I_need_the_function.php

अंदर I_need_the_function.php बस का उपयोग इसमें शामिल हैं:

include_once ("/ server/path/public_html/AJAX/this_is_where_the_php_is_called.php");

अब अपने जावास्क्रिप्ट से sub.domain.com/I_need_the_function.php को कॉल करें।

var sub=""; 
switch(window.location.hostname) 
{ 
case "www.domain.com": 
sub = "/ajax/this_is_where_the_php_is_called.php"; 
break; 
case "domain.com": 
sub = ""; 
break; 
default: ///your subdomain (or add more "case" 's) 
sub = "/I_need_the_function.php"; 
} 


xmlHttp.open("GET",sub,true); 

उदाहरण के रूप में सरल रूप में मैं यह कर सकते हैं। आप बेहतर स्वरूपित पथ का उपयोग करना चाह सकते हैं।

मुझे उम्मीद है कि इससे किसी की मदद मिलती है। यहां कुछ भी गड़बड़ नहीं है - और आप मूल फ़ाइल को कॉल कर रहे हैं, इसलिए कोई भी संपादन सभी कार्यों पर लागू होगा।

15

सभी आधुनिक ब्राउज़र सीओआरएस का समर्थन करते हैं और अब से हमें इस अतिरिक्त लाभ का लाभ उठाना चाहिए।

यह सरल हैंडशेकिंग तकनीक पर काम करता है 2 डोमेन एक दूसरे पर विश्वास/प्राप्त HTTP शीर्षकों के माध्यम से एक-दूसरे पर विश्वास करते हैं। यह लंबे समय से इंतजार कर रहा था क्योंकि एक्सएसएस और अन्य दुर्भावनापूर्ण प्रयासों से बचने के लिए एक ही मूल नीति आवश्यक थी।

क्रॉस-मूल अनुरोध आरंभ करने के लिए, ब्राउज़र एक मूल HTTP शीर्षलेख के साथ अनुरोध भेजता है। इस हेडर का मान वह साइट है जो पृष्ठ परोसता है। उदाहरण के लिए, मान लीजिए http://www.example-social-network.com पर एक पृष्ठ ऑनलाइन -personal-calendar.com में किसी उपयोगकर्ता के डेटा तक पहुंचने का प्रयास करता है। उपयोगकर्ता के ब्राउज़र को लागू करता है तो CORS, निम्नलिखित अनुरोध हेडर भेज दिया जायेगा:

मूल: http://www.example-social-network.com

online-personal-calendar.com अनुरोध की अनुमति देता है, यह एक पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति शीर्षक में भेजता है इसकी प्रतिक्रिया हेडर का मान इंगित करता है कि मूल साइटों को किस प्रकार अनुमति दी जाती है।

पहुंच-नियंत्रण-अनुमति दें-मूल:: उदाहरण के लिए, पिछले अनुरोध के जवाब में निम्नलिखित शामिल हैं http://www.example-social-network.com

सर्वर पार मूल अनुरोध की अनुमति नहीं है, तो ब्राउज़र को एक त्रुटि वितरित कर देगा उदाहरण- social-network.com पृष्ठ ऑनलाइन-personal-calendar.com प्रतिक्रिया के बजाय।

सभी पृष्ठों के लिए उपयोग की अनुमति के लिए, एक सर्वर निम्नलिखित प्रतिक्रिया हेडर भेज सकते हैं:

पहुंच-नियंत्रण-अनुमति दें-मूल: *

हालांकि, इस परिस्थितियाँ होती हैं जिनमें सुरक्षा है के लिए उपयुक्त नहीं होता है एक चिंता।

नीचे विकी पेज में बहुत अच्छी तरह से समझाया गया है। http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

+1

उत्कृष्ट सारांश! – mbfisher

+3

आईई 8 और 9 पूरी तरह से कॉरस का समर्थन नहीं करते हैं। कम से कम मेरी साइटों के लिए, यह अभी भी यातायात का एक महत्वपूर्ण टुकड़ा है। – Brad

+0

मुझे लगता है कि यह IE9 के लिए काम करता है, हो सकता है कि मैं गलत हूं क्योंकि मैं IE8 + के लिए समर्थन जोड़ने के लिए jQuery CORS प्लगइन का उपयोग कर रहा हूं। https://gist.github.com/mathieucarbou/1114981 –