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