Access-Control-Allow-Origin द्वारा मूल नल की अनुमति नहीं है


183

मैंने एक html आउटपुट बनाने के लिए एक छोटी सी xslt फ़ाइल बनाई है, जिसे कोड के साथ weather.xsl कहा जाता है:

<!-- DWXMLSource="http://weather.yahooapis.com/forecastrss?w=38325&u=c" -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="yweather"
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <img src="{/*/*/item/yweather:condition/@text}.jpg"/>
</xsl:template>
</xsl:stylesheet>

मैं HTML आउटपुट में एक html फ़ाइल में एक डिव में लोड करना चाहता हूं जिसे मैं jQuery का उपयोग करने की कोशिश कर रहा हूं:

<div id="result">
<script type="text/javascript">
$('#result').load('weather.xsl');
</script>
</div>

लेकिन मुझे निम्न त्रुटि मिल रही है: Access-Control-Allow-Origin द्वारा उत्पत्ति नल की अनुमति नहीं है।

मैंने एक हेडर को xslt में जोड़ने के बारे में पढ़ा है, लेकिन मुझे यकीन नहीं है कि ऐसा कैसे किया जाए, इसलिए किसी भी मदद की सराहना की जाएगी, और अगर html ouput में लोड नहीं किया जा सकता है, तो फिर और कैसे सलाह दें यह बहुत अच्छा होगा।


क्या यह आपकी वास्तविक load कॉल है? इस पर कोई रास्ता नहीं है?
टीजे क्राउडर

जवाबों:


227

उत्पत्ति nullस्थानीय फ़ाइल प्रणाली है, जिससे यह पता चलता है कि आप उस HTML पृष्ठ को लोड कर रहे हैं loadजो file:///URL के माध्यम से कॉल करता है (उदाहरण के लिए, इसे स्थानीय फ़ाइल ब्राउज़र या समान में डबल-क्लिक करना)। समान उत्पत्ति नीति को लागू करने के लिए विभिन्न ब्राउज़र अलग-अलग दृष्टिकोण अपनाते हैं स्थानीय फ़ाइलों को ।

मेरा अनुमान है कि आप क्रोम का उपयोग करके इसे देख रहे हैं। SOP को स्थानीय फ़ाइलों में लागू करने के लिए क्रोम के नियम बहुत कड़े हैं, यह दस्तावेज़ के समान निर्देशिका से फ़ाइलें लोड करना भी बंद कर देता है। तो ओपेरा करता है। कुछ अन्य ब्राउज़र, जैसे फ़ायरफ़ॉक्स, स्थानीय फ़ाइलों तक सीमित पहुंच की अनुमति देते हैं। लेकिन मूल रूप से, स्थानीय संसाधनों के साथ अजाक्स का उपयोग क्रॉस-ब्राउज़र काम करने वाला नहीं है।

यदि आप स्थानीय रूप से कुछ परीक्षण कर रहे हैं, तो आप वास्तव में वेब पर तैनाती करेंगे, बजाय स्थानीय फ़ाइलों का उपयोग करने के, http://URL के माध्यम से एक साधारण वेब सर्वर स्थापित करें और परीक्षण करें। यह आपको अधिक सटीक सुरक्षा चित्र प्रदान करता है।


1
अपलोड करने के बाद मुझे अब ओरिजिनल नल नहीं मिलता है, लेकिन मुझे अभी भी "Access-Control-Allow-Origin द्वारा अनुमति नहीं है।"
११:१५

3
यदि आप जो संसाधन लोड कर रहे हैं, जैसा आपने दिखाया है ( $('#result').load('weather.xsl');), तो ऐसा नहीं होना चाहिए, क्योंकि अनुरोध स्पष्ट रूप से उसी मूल के लिए है। यदि आप कहीं और से लोड करने की कोशिश कर रहे हैं (जैसे, $('#result').load('http://somewhere.else/weather.xsl');), तो आप फिर से एसओपी में भाग रहे हैं, लेकिन एक अलग तरीके से। अजाक्स अनुरोध एक ही तक ही सीमित हैं मूल (उत्तर में लिंक देखें), या आप एक उपयोग कर रहे हैं CORS -सक्षम ब्राउज़र और सर्वर का समर्थन करता है CORS, सर्वर है कि क्या पार मूल अनुरोध को अनुमति देना चुन सकते हैं।
टीजे क्राउडर

मैंने लोड यूआरएल को बदल दिया। प्रश्न में इसे वापस बदलने से लोड ठीक हो जाता है। मदद के लिए धन्यवाद
dudledok

2
सरल वेब सर्वर सेट करने का सबसे सरल, तेज तरीका क्या है? क्या यहाँ IIS सबसे सरल तरीका होगा?
सियारन गलाघेर

13
@CiaranG मैं python -m SimpleHTTPServerएक कमांड लाइन से भागा और फिर लोकलहोस्ट में गया: 8000, मेरे लिए काम किया। पायथन मैक ओएस एक्स के साथ पूर्वस्थापित है; अगर आपको दूसरे OS का उपयोग करना है तो आपको इंस्टॉल करना पड़ सकता है।
डेव लीपमैन

216

क्रोम और सफारी में स्थानीय संसाधनों के साथ अजाक्स का उपयोग करने पर प्रतिबंध है। इसलिए यह एक त्रुटि की तरह फेंक रहा है

Access-Control-Allow-Origin द्वारा मूल नल की अनुमति नहीं है।

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

--allow-file-access-from-files

अपने Chrome में उपरोक्त पैरामीटर को जोड़ने के बारे में अधिक जानकारी: अपने कार्य पट्टी पर Chrome आइकन पर राइट-क्लिक करें, पॉप-अप विंडो पर Google Chrome पर राइट क्लिक करें और गुणों पर क्लिक करें और शॉर्टकट टैब के तहत लक्ष्य टेक्स्टबॉक्स के अंदर उपरोक्त पैरामीटर जोड़ें। यह नीचे की तरह होगा;

C:\Users\XXX_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

आशा है कि यह मदद करेगा!


19
Mac OS X में, आप टर्मिनल खोलकर क्रोम का विकल्प शुरू कर सकते हैं, और इसमें टाइप करें: /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files & नोट को अंतिम रूप दें और बस इतना है कि आप टर्मिनल का उपयोग जारी रख सकते हैं और इसकी आवश्यकता नहीं है। नोट: यदि आप टर्मिनल बंद करते हैं, तो यह क्रोम विंडो बंद कर देगा।
ब्रूनो बर्नार्डिनो

3
क्या वह सब और बंद और खोला गया। अभी भी नहीं जाना है (क्रोम 27.0.1453.116 मीटर XP पर)
mplungjan

मैं विंडोज 8 के तहत इस पैरामीटर को जोड़ने में सक्षम नहीं हो रहा हूं ..., जो कोई भी जानता है कि इसे कैसे करना है? ...
मोर्टी

मैं कर रहा हूँ एक वेब सर्वर से चल रहा है। क्या बिल्ली है? मैं यह कैसे पता लगा सकता हूँ कि यह स्थानीय फ़ाइलों को कहाँ लोड कर रहा है?
एंडी

जब मैं लक्ष्य-पथ पर -अलग-फ़ाइल-पहुँच-से-फ़ाइलों को जोड़ने का प्रयास करता हूं, तो मुझे ".... अमान्य" संदेश मिलता है, क्या htis समाधान अभी भी मान्य है?
एलेक्स

48

बस यह जोड़ना चाहता था कि "वेबसर्वर चलाएं" उत्तर काफी चुनौतीपूर्ण लगता है, लेकिन यदि आपके पास अपने सिस्टम पर अजगर है (मैकओएस और किसी भी लिनक्स वितरण पर डिफ़ॉल्ट रूप से स्थापित) तो यह उतना आसान है:

python -m http.server  # with python3

या

python -m SimpleHTTPServer  # with python2

इसलिए यदि आपके पास myfile.htmlएक फ़ोल्डर में आपकी html फ़ाइल है, तो कहें mydir, आपको बस इतना करना है:

cd /path/to/mydir
python -m http.server  # or the python2 alternative above

इसके बाद अपने ब्राउज़र को इंगित करें:

http://localhost:8000/myfile.html

और आप कर रहे हैं! वेब सुरक्षा को अक्षम किए बिना, स्थानीय फ़ाइलों को अनुमति देने या यहां तक ​​कि कमांड लाइन विकल्पों के साथ ब्राउज़र को पुनरारंभ करने पर सभी ब्राउज़रों पर काम करता है ।


2
अजगर 3 खिड़कियों पर बराबर है: अजगर-मी http.server [<portNo>]
Aragorn

पायथन 3: python3 -m http.server
जोओ नून्स

लिनक्स पर पायथन 2, 8080 पोर्ट (या कोई अन्य जो आप चाहते हैं) चुनना:python -m SimpleHTTPServer 8080
रॉडरिगो

2

मैं विनम्रतापूर्वक इस SO स्रोत के अनुसार जोड़ना चाहूंगा: https://stackoverflow.com/a/14671362/1743693 , इस तरह की परेशानी अब आंशिक रूप से निम्नलिखित jQuery निर्देश का उपयोग करके हल की गई है:

<script> 
    $.support.cors = true;
</script>

मैंने इसे IE10.0.9200 पर आज़माया, और इसने तुरंत काम किया (jquery-1.9.0.js का उपयोग करके)।

क्रोम 28.0.1500.95 पर - यह निर्देश काम नहीं करता है (यह पूरी तरह से होता है क्योंकि डेविड लिंक के लिंक पर टिप्पणियों में शिकायत करता है)

मेरे साथ काम नहीं कर रही --फाइल-एक्सेस-से-फाइलों के साथ क्रोम चलाना (जैसा कि ऊपर मैस्तुरा के दावे हैं)


2

उपयोग करने के लिए गोखान के समाधान का उपयोग करने के लिए थोड़ा जोड़ना:

--allow-file-access-from-files

अब आपको बस एक पाठ और उसके बाद एक स्थान पर लक्ष्य पाठ में पाठ को जोड़ना होगा। उपरोक्त संपत्ति जोड़ने के बाद सुनिश्चित करें कि आप क्रोम ब्राउज़र के सभी उदाहरणों को बंद कर दें। अब उस आइकन से क्रोम को पुनरारंभ करें जहां आपने यह संपत्ति जोड़ी थी। यह सभी के लिए काम करना चाहिए।


पैरामीटर पहले से ही घोखन टैंक द्वारा प्रस्तुत किया गया था और यह पता लगाना कि इस पैरामीटर के साथ ब्राउज़र को हमेशा कैसे शुरू किया जाए, यह सवाल का हिस्सा नहीं है। इसके अतिरिक्त, आप यह नहीं मान सकते कि हर कोई Microsoft Windows का उपयोग करता है।
jnns

0

मैं एक स्थानीय HTML फ़ाइल से एक सर्वर के लिए XHR अनुरोध करने के लिए एक समाधान की तलाश कर रहा था और क्रोम और PHP का उपयोग करके एक समाधान पाया। (नो जेकरी)

javascripts:

var x = new XMLHttpRequest(); 
if(x) x.onreadystatechange=function(){ 
    if (x.readyState === 4 && x.status===200){
        console.log(x.responseText); //Success
    }else{ 
        console.log(x); //Failed
    }
};
x.open(GET, 'http://example.com/', true);
x.withCredentials = true;
x.send();

मेरा Chrome का अनुरोध शीर्ष लेख Origin: null

मेरा PHP प्रतिक्रिया हेडर (ध्यान दें कि 'null' एक स्ट्रिंग है )। HTTP_REFERER किसी दूरस्थ सर्वर से दूसरे में क्रॉस-ऑरिजिन की अनुमति देता है।

header('Access-Control-Allow-Origin: '.(trim($_SERVER['HTTP_REFERER'],'/')?:'null'),true);
header('Access-Control-Allow-Credentials:true',true);

मैं अपने सर्वर से सफलतापूर्वक कनेक्ट करने में सक्षम था। आप क्रेडेंशियल्स हेडर की उपेक्षा कर सकते हैं, लेकिन यह मेरे लिए अपाचे के AuthType Basicसक्षम होने के साथ काम करता है

मैंने एफएफ और ओपेरा के साथ संगतता का परीक्षण किया, यह कई मामलों में काम करता है जैसे:

VM LAN IP (192.168.0.x) से VM'S WAN (सार्वजनिक) IP पर वापस:
VM LAN IP से दूरस्थ सर्वर डोमेन नाम पर पोर्ट ।
एक स्थानीय .HTML फ़ाइल से VM LAN IP और / या VM WAN IP: पोर्ट,
एक स्थानीय .HTML फ़ाइल से दूरस्थ सर्वर नाम तक।
और इसी तरह।


0

आप file:/स्रोत टैग का उपयोग करके एक स्थानीय जावास्क्रिप्ट फ़ाइल (अपने स्रोत पृष्ठ के नीचे पेड़ में ) लोड कर सकते हैं :

<script src="my_data.js"></script>

यदि आप अपने इनपुट को जावास्क्रिप्ट में एन्कोड करते हैं, जैसे कि इस मामले में:

mydata.js :

$xsl_text = "<xsl:stylesheet version="1.0" + ....

(यह json के लिए आसान है) तो आपके पास एक जावास्क्रिप्ट डेटा वैरिएबल में आपका 'डेटा' है जैसा आप चाहते हैं।

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