Aynı orijinli politika nedeniyle, http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xmladresinde konuşlandırılan bir dosyadan ajax çağrısı yapamazsınız .http://run.jsbin.com
Kaynak (diğer adıyla orijin ) sayfası ve hedef URL farklı etki alanlarında ( run.jsbin.comve www.ecb.europa.eu) olduğundan, kodunuz aslında sıradan olmayan bir Web Alanları Arası (CORS) isteği yapmaya çalışıyor GET.
Birkaç kelimeyle, aynı kaynak politikası , tarayıcıların sadece HTML sayfasının aynı etki alanındaki hizmetlere ajax çağrılarına izin vermesi gerektiğini söylüyor .
Misal:
A sayfa http://www.example.com/myPage.htmlcan sadece doğrudan altındadır hizmetlerini talep http://www.example.comgibi http://www.example.com/api/myService. Hizmet başka bir alanda barındırılıyorsa (örneğin http://www.ok.com/api/myService), tarayıcı aramayı doğrudan yapmaz (beklediğiniz gibi). Bunun yerine, bir CORS talebinde bulunmaya çalışacaktır.
Kısaca söylemek gerekirse, farklı etki alanlarında bir (CORS) isteği * gerçekleştirmek için tarayıcınız:
OriginOrijinal isteğe bir başlık ekler (değer olarak sayfanın etki alanıyla) ve bunu her zamanki gibi gerçekleştirir; ve sonra
- Yalnızca sunucu yanıtı o isteğine içerir (yeterli başlıklarını
Access-Control-Allow-Originolan bir tanesi ) CORS talep sağlayan, göz çağrısı (neredeyse ** HTML sayfası aynı etki de olsaydı olurdu tam yolu) tamamlayacak.
- Beklenen başlıklar gelmezse, tarayıcı basitçe pes eder (size yaptığı gibi).
* Yukarıdaki tasvir etmektedir Bir adımlar basit bir duzgun olarak istek, GEThiçbir fantezi başlıklarıyla. (A gibi istek basit değilse POSTile application/jsoniçerik türü gibi), tarayıcı bunu yerine getirmeden önce, bir an tutun ve edecek ilk olarak bir göndereceğiz OPTIONShedef URL'ye isteği. Yukarıdaki gibi, yalnızca bu OPTIONSisteğe verilen yanıt CORS başlıklarını içeriyorsa devam edecektir . Bu OPTIONSçağrı, ön kontrol isteği olarak bilinir .
** Neredeyse söylüyorum çünkü normal aramalar ile CORS aramaları arasında başka farklılıklar var. Önemli bir nokta, bazı başlıkların, yanıtta mevcut olsalar bile ,Access-Control-Expose-Headers başlığa dahil edilmemişlerse tarayıcı tarafından alınmayacağıdır .
Nasıl düzeltilir?
Sadece bir yazım hatası mıydı? Bazen JavaScript kodunun hedef etki alanında yalnızca bir yazım hatası vardır. Kontrol ettin mi? Sayfa www.example.comyerindeyse, yalnızca düzenli aramalar yapacaktır www.example.com! Tarayıcı tarafından farklı alan adları gibi diğer URL'ler, api.example.comhatta example.comveya www.example.com:8080bunlar olarak kabul edilir ! Evet, bağlantı noktası farklıysa, o zaman farklı bir etki alanıdır!
Başlıkları ekleyin. CORS'u etkinleştirmenin en basit yolu Access-Control-Allow-Origin, sunucunun yanıtlarına gerekli başlıkları (as ) eklemektir . (Her sunucunun / dilin bunu yapmanın bir yolu vardır - buradan bazı çözümleri kontrol edin .)
Son çare: Hizmete sunucu tarafında erişiminiz yoksa, onu da yansıtabilir ( ters proxy'ler gibi araçlar aracılığıyla ) ve gerekli tüm başlıkları buraya dahil edebilirsiniz.