Aşağıdaki araştırmada API olarak, sorunuzdaki http: // myApiUrl / login yerine http://example.com kullanıyorum , çünkü bu ilk çalışma çalışıyor.
Sayfanızın http: //my-site.local: 8088 adresinde olduğunu varsayıyorum .
Farklı sonuçlar görmenizin nedeni Postacı:
- üstbilgiyi ayarla
Host=example.com
(API'nız)
- Başlık ayarlanmadı
Origin
Bu, site ve API aynı etki alanına sahip olduğunda tarayıcıların istek gönderme yöntemine benzer (tarayıcılar da başlık öğesini ayarlar Referer=http://my-site.local:8088
, ancak Postacı'da görmüyorum). Ne zaman Origin
başlık edilir değil set, genellikle sunucuları varsayılan olarak bu tür istekleri verir.
Postacı'nın istekleri göndermenin standart yolu budur. Ancak , siteniz ve API'nız farklı alan adlarına sahip olduğunda bir tarayıcı istekleri farklı şekilde gönderir ve ardından CORS oluşur ve tarayıcı otomatik olarak:
- üstbilgiyi ayarlar
Host=example.com
(sizinki API olarak)
- üstbilgiyi ayarlar
Origin=http://my-site.local:8088
(siteniz)
(Başlık Referer
, ile aynı değere sahiptir Origin
). Ve şimdi Chrome'un Konsol ve Ağlar sekmesinde şunları göreceksiniz:
Eğer varsa Host != Origin
bu genellikle, bu CORS olduğu ve sunucu böyle bir talebi algıladığında varsayılan olarak engelleme yapar .
Origin=null
HTML içeriğini yerel bir dizinden açtığınızda ayarlanır ve bir istek gönderir. Aynı durum, <iframe>
aşağıdaki snippet'teki gibi bir istek gönderdiğinizde (ancak burada Host
başlık hiç ayarlanmamıştır) - genel olarak, HTML spesifikasyonunun opak kökenli olduğu her yerde bunu çevirebilirsiniz Origin=null
. Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz .
fetch('http://example.com/api', {method: 'POST'});
Look on chrome-console > network tab
Basit bir CORS isteği kullanmazsanız, tarayıcı genellikle ana isteği göndermeden önce otomatik olarak bir SEÇENEK isteği gönderir - daha fazla bilgi burada . Aşağıdaki snippet bunu gösterir:
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)
Sunucunuzun yapılandırmasını CORS isteklerine izin verecek şekilde değiştirebilirsiniz.
İşte nginx (nginx.conf dosyası) üzerinde CORS'yi açan bir örnek yapılandırma - always/"$http_origin"
nginx ve "*"
Apache için ayarlara çok dikkat edin - bu, CORS'nin herhangi bir alandan engellemesini kaldırır.
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'de (.htaccess dosyası) CORS'yi açan örnek bir yapılandırma
# ------------------------------------------------------------------------------
# | 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"