2012-06-04 17 views
70

है, तो मैं इस कोरस समस्या से फंस गया हूं, भले ही मैं उचित शीर्षकों के साथ सर्वर (nginx/node.js) सेट करता हूं।घातक कोर जब http: // localhost मूल

मैं क्रोम नेटवर्क फलक में देख सकते हैं -> प्रतिक्रिया हेडर:

Access-Control-Allow-Origin:http://localhost 

जो चाल करना चाहिए।

यहाँ कोड है कि अब मैं परीक्षण करने के लिए उपयोग:

var xhr = new XMLHttpRequest(); 
xhr.onload = function() { 
    console.log('xhr loaded'); 
}; 
xhr.open('GET', 'http://stackoverflow.com/'); 
xhr.send(); 

मैं

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

मिल मुझे लगता है यह ग्राहक स्क्रिप्ट में कोई समस्या नहीं है और सर्वर विन्यास है ...

+17

नहीं है, तो आप इस stackoverflow.com हेडर स्थापित करने के लिए, नहीं की जरूरत है साथ ही स्थानीय होस्ट यूआरएल फिल्टर करने के लिए। :एक्स। अन्यथा समान मूल नीति का बिंदु क्या होगा। – Esailija

+2

आपके द्वारा सेट किए गए सर्वर तक पहुंचने का प्रयास करें, जो ओवरफ़्लो ढेर नहीं है। ;) – Nek

+0

डीओएच! क्या संसाधन मूल प्राप्त करने के लिए क्रोम (या अन्य ब्राउज़र) को बताने का कोई तरीका है, भले ही हेडर गुम हो जाए, जब मेरी उत्पत्ति लोकलहोस्ट हो? – whadar

उत्तर

117

क्रोम does not support localhost for CORS requests (2010 से एक खुली बग)।

इसके आसपास पाने के लिए आप lvh.me (जो 127.0.0.1 पर स्थानीय लोकस्ट की तरह) पर डोमेन का उपयोग कर सकते हैं या --disable-web-security ध्वज के साथ क्रोम शुरू कर सकते हैं (माना जाता है कि आप केवल परीक्षण कर रहे हैं)।

+0

यह सही नहीं है। मैं क्रोम – greensuisse

+10

@greensuisse के साथ लोकलहोस्ट पर पोस्ट करने में सक्षम हूं - यह स्थानीयहोस्ट पर पोस्ट नहीं कर रहा है। यह * स्थानीयहोस्ट से * पोस्ट कर रहा है जो समस्या है। – Cheeso

+1

वह बग अमान्य है (और इस तरह चिह्नित किया गया है - http://crbug.com/67743#c17)। [Esailija की टिप्पणी] (http://stackoverflow.com/questions/10883211/deadly-cors-when-http-localhost-is-the-origin#comment14184025_10883211) सही है, इन हेडर को लोकलहोस्ट में जोड़ने से आप जादुई रूप से पहुंच नहीं पाएंगे अन्य सभी साइटों। यह दूरस्थ साइट है जिसे इन शीर्षकों के साथ परोसा जाना चाहिए। –

15

असली समस्या यह है कि अगर हम सभी अनुरोधों के लिए सेट करें - विकल्प - विकल्प पोस्ट), क्रोम इसे रद्द कर देगा। निम्नलिखित कोड पोस्ट के साथ मेरे लिए काम करता क्रोम

<?php 
if (isset($_SERVER['HTTP_ORIGIN'])) { 
    //header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); 
    header("Access-Control-Allow-Origin: *"); 
    header('Access-Control-Allow-Credentials: true');  
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
} 
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) 
     header("Access-Control-Allow-Methods: GET, POST, OPTIONS");   
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) 
     header("Access-Control-Allow-Headers:{$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); 

    exit(0); 
} 
?> 
+2

ओपी nginx/node.js का उपयोग कर रहा है। PHP नहीं –

4

साथ स्थानीय होस्ट करने के लिए प्रति @ Beau का जवाब, क्रोम स्थानीय होस्ट CORS अनुरोध का समर्थन नहीं करता है, और संभावना नहीं है इस दिशा में कोई बदलाव।

मैं इस समस्या को हल करने के लिए Allow-Control-Allow-Origin: * Chrome Extension का उपयोग करता हूं। विस्तार CORS के लिए आवश्यक HTTP हेडर जोड़ देगा:

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: "GET, PUT, POST, DELETE, HEAD, OPTIONS" 
Access-Control-Expose-Headers: <you can add values here> 

source code is published on Github

ध्यान दें कि एक्सटेंशन डिफ़ॉल्ट रूप से सभी यूआरएल फ़िल्टर करता है। यह कुछ वेबसाइटों को तोड़ सकता है (उदाहरण के लिए: ड्रॉपबॉक्स)। मैं इसे बदल दिया है निम्न URL फिल्टर

*://localhost:*/* 
संबंधित मुद्दे