मेरे पास निम्नलिखित सेगमेंट के साथ एक वेबसाइट है:
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प्रीफ़लाइट को बिल्कुल भी होने से रोक दिया ।