एपीआई के रूप में नीचे दी गई जांच में, मैं आपके प्रश्न से http: // myApiUrl / लॉगिन के बजाय http://example.com का उपयोग करता हूं , क्योंकि यह पहला काम है।
मुझे लगता है कि आपका पृष्ठ http: //my-site.local: 8088 पर है ।
अलग-अलग परिणाम देखने का कारण यह है कि पोस्टमैन:
- हेडर सेट करें
Host=example.com
(आपका एपीआई)
- हेडर सेट नहीं है
Origin
यह ब्राउज़र के अनुरोध भेजने के तरीके के समान है जब साइट और एपीआई में एक ही डोमेन होता है (ब्राउज़र हेडर आइटम भी सेट करता है Referer=http://my-site.local:8088
, हालांकि मैं इसे पोस्टमैन में नहीं देखता हूं)। जब Origin
हेडर सेट नहीं होता है, तो आमतौर पर सर्वर डिफ़ॉल्ट रूप से ऐसे अनुरोधों की अनुमति देते हैं।
यह मानक तरीका है कि पोस्टमैन अनुरोध कैसे भेजता है। लेकिन जब आपकी साइट और API में अलग-अलग डोमेन होते हैं , तो एक ब्राउज़र अलग-अलग अनुरोध भेजता है , और फिर CORS होता है और ब्राउज़र स्वचालित रूप से:
- हेडर सेट करता है
Host=example.com
(आपका एपीआई के रूप में)
- शीर्ष लेख
Origin=http://my-site.local:8088
(आपकी साइट)
(हेडर के रूप Referer
में एक ही मूल्य है Origin
)। और अब Chrome के कंसोल और नेटवर्क टैब में आप देखेंगे:
जब आपके पास Host != Origin
यह कॉर्स होता है, और जब सर्वर इस तरह के अनुरोध का पता लगाता है, तो यह आमतौर पर इसे डिफ़ॉल्ट रूप से ब्लॉक करता है ।
Origin=null
जब आप HTML सामग्री को किसी स्थानीय निर्देशिका से खोलते हैं, और यह एक अनुरोध भेजता है। ऐसी ही स्थिति तब होती है जब आप <iframe>
नीचे दिए गए स्निपेट की तरह एक अनुरोध भेजते हैं (लेकिन यहां Host
हेडर बिल्कुल सेट नहीं है) - सामान्य तौर पर, हर जगह HTML विनिर्देशन अपारदर्शी मूल कहता है, आप इसका अनुवाद कर सकते हैं Origin=null
। इसके बारे में अधिक जानकारी आप यहां पा सकते हैं ।
fetch('http://example.com/api', {method: 'POST'});
Look on chrome-console > network tab
यदि आप एक सरल CORS अनुरोध का उपयोग नहीं करते हैं, तो आमतौर पर ब्राउज़र स्वचालित रूप से मुख्य अनुरोध भेजने से पहले एक विकल्प अनुरोध भी भेजता है - अधिक जानकारी यहाँ है । नीचे दिया गया स्निपेट यह दिखाता है:
fetch('http://example.com/api', {
method: 'POST',
headers: { 'Content-Type': 'application/json'}
});
Look in chrome-console -> network tab to 'api' request.
This is the OPTIONS request (the server does not allow sending a POST request)
आप CORS अनुरोधों की अनुमति देने के लिए अपने सर्वर के कॉन्फ़िगरेशन को बदल सकते हैं।
यहां एक उदाहरण कॉन्फ़िगरेशन है जो कॉर्न्स को nginx (nginx.conf फ़ाइल) पर चालू करता है - always/"$http_origin"
nginx और "*"
Apache के लिए सेटिंग के साथ बहुत सावधान रहें - यह किसी भी डोमेन से CORS को अनब्लॉक करेगा।
location ~ ^/index\.php(/|$) {
...
add_header 'Access-Control-Allow-Origin' "$http_origin" always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
if ($request_method = OPTIONS) {
add_header 'Access-Control-Allow-Origin' "$http_origin"; # DO NOT remove THIS LINES (doubled with outside 'if' above)
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Max-Age' 1728000; # cache preflight value for 20 days
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'My-First-Header,My-Second-Header,Authorization,Content-Type,Accept,Origin';
add_header 'Content-Length' 0;
add_header 'Content-Type' 'text/plain charset=UTF-8';
return 204;
}
}
यहाँ एक उदाहरण विन्यास है जो अपाचे (.htaccess फ़ाइल) पर CORS को चालू करता है
# ------------------------------------------------------------------------------
# | Cross-domain Ajax requests |
# ------------------------------------------------------------------------------
# Enable cross-origin Ajax requests.
# http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity
# http://enable-cors.org/
# <IfModule mod_headers.c>
# Header set Access-Control-Allow-Origin "*"
# </IfModule>
# Header set Header set Access-Control-Allow-Origin "*"
# Header always set Access-Control-Allow-Credentials "true"
Access-Control-Allow-Origin "http://your-page.com:80"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Allow-Headers "My-First-Header,My-Second-Header,Authorization, content-type, csrf-token"