පහත දැක්වෙන විමර්ශනයේදී API ලෙස, මම ඔබේ ප්රශ්නයෙන් http: // myApiUrl / login වෙනුවට http://example.com භාවිතා කරමි , මන්ද මෙම පළමු එක ක්රියාත්මක වන බැවිනි.
ඔබගේ පිටුව http: //my-site.local: 8088 හි ඇතැයි මම සිතමි .
ඔබ වෙනස් ප්රති results ල දැකීමට හේතුව තැපැල්කරු:
- ශීර්ෂකය සකසන්න
Host=example.com
(ඔබගේ API)
- ශීර්ෂකය සකසා නැත
Origin
වෙබ් අඩවිය සහ ඒපීඅයි එකම වසමක් ඇති විට මෙය බ්රව්සර් ඉල්ලීම් යැවීමේ ක්රමයට සමාන වේ (බ්රව්සර් ද ශීර්ෂ අයිතමය සකසයි Referer=http://my-site.local:8088
, කෙසේ වෙතත් මම එය තැපැල්කරු තුළ නොදකිමි). ශීර්ෂකය සකසා නොමැති විට , සාමාන්යයෙන් සේවාදායකයන් එවැනි ඉල්ලීම් පෙරනිමියෙන් ලබා දේ.Origin
තැපැල්කරු ඉල්ලීම් යවන සම්මත ක්රමය මෙයයි. නමුත් ඔබේ වෙබ් අඩවිය සහ ඒපීඅයි විවිධ වසම් ඇති විට බ්රව්සරයක් වෙනස් ආකාරයකින් ඉල්ලීම් යවයි , පසුව CORS සිදු වන අතර බ්රව්සරය ස්වයංක්රීයව:
- ශීර්ෂකය සකසයි
Host=example.com
(ඔබගේ API ලෙස)
- ශීර්ෂකය සකසයි
Origin=http://my-site.local:8088
(ඔබේ වෙබ් අඩවිය)
(ශීර්ෂයට Referer
සමාන අගයක් ඇත Origin
). දැන් ක්රෝම් හි කොන්සෝලය සහ ජාල පටිත්තෙහි ඔබට පෙනෙනු ඇත:
ඔබ සතුව Host != Origin
මෙය CORS වන අතර, සේවාදායකයා එවැනි ඉල්ලීමක් හඳුනාගත් විට, එය සාමාන්යයෙන් එය පෙරනිමියෙන් අවහිර කරයි .
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 ගොනුව) මත CORS සක්රිය කරන උදාහරණ වින්යාසය මෙන්න - 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;
}
}
Apache (.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"