ในการตรวจสอบด้านล่างว่าเป็น API ฉันใช้http://example.comแทนhttp: // myApiUrl / เข้าสู่ระบบจากคำถามของคุณเพราะอันแรกใช้ได้
ฉันคิดว่าหน้าของคุณอยู่ในhttp: //my-site.local: 8088
สาเหตุที่คุณเห็นผลลัพธ์ต่างกันคือบุรุษไปรษณีย์:
- ส่วนหัวชุด
Host=example.com
(API ของคุณ)
- ไม่ได้ตั้งค่าส่วนหัว
Origin
นี้จะคล้ายกับวิธีที่เบราว์เซอร์ของการส่งคำขอเมื่อสถานที่และ API มีโดเมนเดียวกัน (เบราว์เซอร์ยังตั้งค่ารายการส่วนหัวReferer=http://my-site.local:8088
แต่ผมไม่เห็นมันใน Postman) เมื่อไม่ได้ตั้งค่าOrigin
ส่วนหัวโดยปกติเซิร์ฟเวอร์อนุญาตการร้องขอดังกล่าวตามค่าเริ่มต้น
วิธีนี้เป็นวิธีมาตรฐานวิธีการที่บุรุษไปรษณีย์ส่งคำขอ แต่เบราว์เซอร์ส่งคำขอแตกต่างกันเมื่อไซต์และ API ของคุณมีโดเมนที่แตกต่างกันจากนั้นCORSจะเกิดขึ้นและเบราว์เซอร์จะดำเนินการโดยอัตโนมัติ:
- ตั้งค่าส่วนหัว
Host=example.com
(ของคุณเป็น API)
- ชุดส่วนหัว
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
หากคุณไม่ได้ใช้ง่ายล ธ ขอมักเบราว์เซอร์โดยอัตโนมัตินอกจากนี้ยังส่ง OPTIONS ขอก่อนที่จะส่งคำขอหลัก - ข้อมูลเพิ่มเติมที่นี่ ตัวอย่างด้านล่างแสดง:
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
นี่คือการกำหนดค่าตัวอย่างซึ่งเปิด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;
}
}
นี่คือการกำหนดค่าตัวอย่างซึ่งเปิดCORS บน Apache (ไฟล์. htaccess)
# ------------------------------------------------------------------------------
# | 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"