2013-05-05 26 views
10

RESTful API kullanarak bazı servisler için bir web uygulaması yazıyorum. API, https://api.example adresinde ve https://app.example numaralı telefondan edinilebilir. CORS kullanan Basit GET istekleri Chrome ve Firefox'ta gayet iyi çalışıyor. Bazı yöntem POST üzerinden veri kabul eder ve 303 kodu Konum başlığı içinde yeni uri ile döndürür.Tarayıcı neden XMLHTTPRequest ve CORS kullanarak yönlendirmeleri takip etmiyor?

Uçuş öncesi SEÇENEKLER isteği gayet:

Request Method:OPTIONS 
Status Code:200 OK 

talep Başlıkları

Accept:*/* 
Accept-Charset:UTF-8,*;q=0.5 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8,ru;q=0.6 
Access-Control-Request-Headers:origin, authorization, content-type 
Access-Control-Request-Method:POST 
Connection:keep-alive 
DNT:1 
Host:api.example 
Origin:https://app.example 
Referer:https://app.example/app/ 
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.32 (KHTML, like Gecko) Chrome/27.0.1425.0 Safari/537.32 SUSE/27.0.1425.0 

Yanıt Başlıkları

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:Authorization, Content-Type 
Access-Control-Allow-Methods:GET,POST,PUT,DELETE,HEAD,OPTIONS 
Access-Control-Allow-Origin:https://app.example 
Access-Control-Expose-Headers:* 
Access-Control-Max-Age:3628800 
Connection:keep-alive 
Content-Length:0 
Date:Sun, 05 May 2013 15:22:50 GMT 
Server:nginx/1.2.5 

Sonra asıl isteği sadece 303 aldıktan sonra durdurmak:

Request URL:https://api.example 
Request Method:POST 
Status Code:HTTP/1.1 303 See Other 

Tepki başlıkları: RFC kullanıcı aracısı tarafından

Server:nginx/1.2.5 
Location:https://api.example/some_url 
Date:Sun, 05 May 2013 15:27:49 GMT 
Content-Type:application/json 
Content-Length:0 
Connection:keep-alive 
Access-Control-Max-Age:3628800 
Access-Control-Expose-Headers:* 
Access-Control-Allow-Origin:https://app.example 
Access-Control-Allow-Methods:GET,POST,PUT,DELETE,HEAD,OPTIONS 
Access-Control-Allow-Headers:Authorization, Content-Type 
Access-Control-Allow-Credentials:true 

yönlendirmeleri takip etmeli, ancak Chrome ve FF beklendiği gibi davranmaz gibi görünüyor. Tarayıcıların bir hatası mı yoksa yanlış bir şey mi yapıyorum?

Güncelleme: Eğer krom ile başlayabilirim --disable-web-security ile her şey iyi çalışıyor.

+0

'Gerçek' istek için istek başlıklarınız nedir (CORS uçuş öncesi değil)? Ben çok benzer bir problem yaşıyorum. Herhangi bir şansla çözdün mü? – vrutberg

+2

Chromium'daki bu hata raporu, https://code.google.com/p/chromium/issues/detail?id=237490 – vrutberg

+0

@vrutberg ile ilgili olabilir. Tam olarak aynı görünüyor. Üstelik * bazen * çalışır. Örneğin, hem http://samples.msdn.microsoft.com/ietestcenter/CORS/CORS_014.htm adresindeki bir msdn testi hem Chrome'da hem de FF'de geçer. Bir arkadaşım tam olarak aynı kodu aldı ve sunucusuna koydu ve işe yaramıyor! http://twinspect.net/cors.htm – galadog

cevap

1

burada onun krom hata ise krom desteğini verdiği Kodunuzdaki üzerindeki olası hataları: aynı kaynak isteğini farklı kökenli bir yönlendirme neden olursa

  1. ,
    zorlamaz erişim denetimi Yeniden yönlendirme yanıtı
    'un kendisi için denetler, çünkü yönlendirmeyle sonuçlanan istek, aynı kökenli
    idi.

  2. aynı kaynak isteğini farklı kökenli bir yönlendirme neden olursa

    ,
    benzersiz bir güvenlik kökenli kullanmayan yeni istek için menşe olarak orijinal isteğin URL'sini kullanın. İstemci (yani, XMLHttpRequest) istemcisinin, ilk olarak kimlik bilgilerinin gönderilip gönderilmeyeceğini fiilen
    isteyip istemediğini takip edin. Bir aynı kaynak isteği farklı bir kaynağa yönlendirdiğinde, orijinal isteği, ister istemez olsun veya olmasın çerezleri gönderir, çünkü aynı kökenlidir. Yeni çapraz kaynaklı istek, istekte bulunulmadıkça çerezleri göndermemelidir, böylece erişim denetimi üzerinde denetlenir, sunucu "Erişim-Denetim-İzin-Kökeni = *" verdiyse yanıt başarılı olur.

+0

Sorunun aynı kökenli bir isteği içermediğine inanıyorum. 302 cevabı olan çapraz kaynaklı bir talepti. –

13

Ben de bununla mücadele ettiğime. Önceden aydınlatılmış CORS talepleri için 3xx yönlendirmesinin, bu özellik tarafından yasaklandığı anlaşılmaktadır.spec itibaren

http://www.w3.org/TR/cors/

:

(Adım 1. ve 2. detay ön kontrol süreci Ve biz adıma gel ....)

... 3. Bu, gerçek isteği'dur. Bir istekte bulunma adımlarını uygulayın ve isteği yaparkenistek kurallarını inceleyin.

tepki 301, 302, 303, 307, veya 308 bir HTTP durum kodu cache and network error steps uygula varsa

.

Sonra http://www.w3.org/TR/cors/#cache-and-network-error-steps aşağı kaydırmak durumunda:

ağ hatası uygulanır adımlar zaman, adımların bu seti çağrılan algoritmayı sonlandırmak ve çapraz menşe isteği durumunu ayarlamak Ağ hatası için .

Not: Bu, kullanıcı kimlik bilgilerinin ayarlanması üzerinde bir etkisi yoktur. Yani çerez bayrağının bloku kaldırılırsa, cevaplar tarafından çerezler ayarlanır.

önbellek ve ağ hatası uygulanır adımlar çıktıkça bu adımları izleyin:

köken alan değer kaynak kökenli ve url için harfe duyarlı maç uçuş öncesi sonuç önbellek girdilerini kaldırın alan değeri , istek URL'si için büyük/küçük harfe duyarlı bir eşlemedir.

önbellek ve ağ hatası adımlarını çağırılan algoritma, ağ hatası adımlarını çağırmaya çalışıyormuş gibi davranan ağ hatası adımlarını uygulayın.

(doc alınan Vurgu.)

3xx yönlendirmeleri Ancak basit CORS istekleri için izin verilmektedir.

İlgili konular