क्रॉस ओरिजिनल रिसोर्स शेयरिंग (कॉर्स) नगीनक्स / क्रोम के साथ


13

मेरे पास निम्नलिखित सेगमेंट के साथ एक वेबसाइट है:

api.example.com 
developers.example.com 
example.com

मैं दोनों की अनुमति देने के लिए करना चाहते हैं example.comऔर developers.example.comकरने के लिए AJAX अनुरोध करने के लिए api.example.com

मेरे लिए अब तक का nginx विन्यास api.example.com, जो एक गेंडा द्वारा परोसा जा रहा एक रैक ऐप है, इस तरह दिखता है:

upstream app_server {
  server unix:/tmp/api.example.com.sock fail_timeout=0;
}

server {
       listen 80;
       server_name api.example.com;
       access_log /home/nginx/api.example.com/log/access.log;
       error_log /home/nginx/api.example.com/log/error.log;
       location / {
         add_header 'Access-Control-Allow-Origin' 'http://example.com,http://developers.example.com';
         add_header 'Access-Control-Allow-Credentials' 'true';
         add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept';
         add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';

         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         proxy_pass http://app_server;
       }

}

मेरे पढ़ने के आधार पर, मैं जो करने की कोशिश कर रहा हूं, उसके लिए यह पर्याप्त होना चाहिए।

विकल्प प्रतिक्रिया:

HTTP/1.1 200 OK
Server: nginx/0.7.67
Date: Sat, 28 Apr 2012 17:20:08 GMT
Content-Type: application/json
Connection: close
Status: 200 OK
Content-Length: 0
Access-Control-Allow-Origin: http://developers.example.com,http://example.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type,Accept
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE

लेकिन जब मैं क्रोम कंसोल में निम्नलिखित प्रयास करता हूं:

$.ajax("http://api.example.com", {
  type: 'get',
  contentType: "application/json",
  accept: "application/json"
}).success(function(data){
  console.log("success!", data);
}).fail(function(jqxhr, statusText){
  console.log("fail!", jqxhr, statusText);
})

समझा:

XMLHttpRequest cannot load http://api.example.com/. Origin
http://developers.example.com is not allowed by Access-Control-Allow-Origin.

और http://example.com के लिए भी ऐसा ही है ।

मुझे किसकी याद आ रही है?

अगर मैं सेट Access-Control-Allow-Originकरने के लिए *तो मैं देख रहा हूँ:

HTTP/1.1 200 OK
Server: nginx/0.7.67
Date: Sat, 28 Apr 2012 17:28:41 GMT
Content-Type: application/json
Connection: close
Status: 200 OK
Content-Length: 0
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type,Accept
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE

लेकिन jQuery का अनुरोध अभी भी विफल रहता है, क्रोम के साथ यह भी उजागर होता है कि पूर्व-उड़ान OPTIONSविफल रही (भले ही वह वापस लौट आए 200 OK)।

जवाबों:


17

CORS युक्ति के अनुसार कई उत्पत्ति को रिक्त स्थान से अलग किया जाना चाहिए, न कि अल्पविराम जैसा कि आपने उपयोग किया है, इसलिए इस शीर्ष लेख को भेजने का प्रयास करें:

Access-Control-Allow-Origin: http://developers.example.com http://example.com

मोज़िला प्रलेखन कई मूल का उल्लेख नहीं है, हालांकि, इसलिए यदि है कि अभी भी केवल भेजने काम कोशिश नहीं करता:

Access-Control-Allow-Origin: http://developers.example.com

यदि यह काम करता है तो आपको अनुमत सूची से मेल खाने वाले क्लाइंट द्वारा भेजे गए हेडर Access-Control-Allow-Originके मूल्य वाले हेडर को वापस करने के लिए nginx या अपने एप्लिकेशन सर्वर को कॉन्फ़िगर करना होगा Origin। निम्नलिखित (अप्रयुक्त) नग्नेक्स विन्यास जैसा कुछ कर सकता है:

if ($http_origin ~ "^(http://developers.example.com|http://example.com)$") {
    add_header "Access-Control-Allow-Origin" $http_origin;
}

यह वह चीज है जिसका मैंने अंत किया। मैंने Access-Control-Allow-Headerहेडर को भी हटा दिया , और अपने jQuery कॉल को इस तरह संशोधित किया: $.ajax("http://api.example.com", { type: 'get', crossDomain: true}) जिसने OPTIONSप्रीफ़लाइट को बिल्कुल भी होने से रोक दिया ।
जॉन लेडबेटर

1
नोट: यदि दिए गए समाधान आपके लिए काम नहीं करते हैं, तो इसे और इसे पढ़ें । यह ज्ञानवर्धक है, और आपको यह काम नहीं करने का कारण मिल सकता है।
इसका_मी

4

ifएक locationब्लॉक में एक nginx विन्यास में इस तरह का उपयोग करना :

if ($http_origin ~ "^(http://developers.example.com|http://example.com)$") {
    add_header "Access-Control-Allow-Origin" $http_origin;
}

अजीब चीजें करने के लिए नगीनक्स का कारण बनें। विशेष रूप से, proxy_passऔर try_filesअपेक्षा के अनुरूप काम न करें। अधिक जानकारी के लिए http://wiki.nginx.org/IfIsEvil देखें ।

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