Aynı orijinli politika nedeniyle, http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
adresinde 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.com
ve 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.html
can sadece doğrudan altındadır hizmetlerini talep http://www.example.com
gibi 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:
Origin
Orijinal 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-Origin
olan 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, GET
hiçbir fantezi başlıklarıyla. (A gibi istek basit değilse POST
ile application/json
içerik türü gibi), tarayıcı bunu yerine getirmeden önce, bir an tutun ve edecek ilk olarak bir göndereceğiz OPTIONS
hedef URL'ye isteği. Yukarıdaki gibi, yalnızca bu OPTIONS
isteğ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.com
yerindeyse, yalnızca düzenli aramalar yapacaktır www.example.com
! Tarayıcı tarafından farklı alan adları gibi diğer URL'ler, api.example.com
hatta example.com
veya www.example.com:8080
bunlar 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.