2011-12-20 3 views
1

IE9에서 어려운 ajax 오류가 발생했습니다. 나는 이것이 기술적으로 크로스 도메인 요청이 아니라는 것을 최전선으로 말할 것이므로 문제가 아닌 것으로 확신합니다.IE9 JQuery.ajax가 미스터리 오류를 던졌습니다

편집 : 이유는 분명하지 않지만 (의견보기 참조) 동일한 도메인 요청이 교차 도메인으로 처리되는 것과 관련이있는 것으로 보입니다.

크로스 도메인 아약스 요청을 만들기 위해 로컬 프록시를 사용하고 있습니다. 사용하는 URL은 http://localhost/proxy/?target=.....입니다. 좋은 브라우저는 모두 만족하지만 IE는 요청이 발송되기도 전에 즉시 오류를 반환합니다. 이것은 Fiddler와 IE의 개발자 도구 네트워크 캡처를 사용하여).

JQuery의 ajax.error 콜백에 전달 된 오류 객체를 검사 할 때 isRejected() 함수가 true를 반환하지만 요청 거부를 유발할 수없는 것을 알 수 없습니다. 오류 객체의 readyState가 4 (요청이 완료되었음을 의미 함)이고 status는 0이고 statusText는 "error"입니다.

나는 조금이처럼 내 요청을 짓고 있어요 :

proxy.beforeRequestSend 기능은 다음과 같습니다
$.ajax(url, { 
    data: {...list of parameters...}, 
    dataType: 'json', 
    type: 'GET', 
    success: function() { ... }, 
    error: function() { ... }, 
    beforeSend: proxy.beforeRequestSend, 
    timeout: 35000 
}); 

:

this.beforeRequestSend = function(XHR, settings) { 

    if(that.proxyRequired(settings.url)) { 
    // I've also tried using the full url (http://localhost/proxy/?...) 
    settings.url = 'proxy/?target=' + encodeURIComponent(settings.url); 
    } 
}; 

사람이 요청이 크게 실패하는 원인이 무엇인지 알고 있나요 IE9? 불행히도 나는 테스트를 위해 IE8이나 7에 접근 할 수 없지만 같은 행동을한다고 가정한다. JQuery의 ajax 오류 처리기가 호출된다는 사실은 요청을 작성하는 동안 오류가 발생하지 않았지만 요청이 실행될 때 발생한다고 제안합니다. 다른 모든 브라우저에서 제대로 작동한다는 것은 기본 사항이 정확함을 나타냅니다.

나는 이전에 JQuery와/IE 콤보는 URL 인코딩 일부 문자를,하지만 난 beforeSend의 끝에서 settings.url을 경고하는 경우 대상 URL이 제대로 인코딩 기능 문제가 읽었습니다 (이 또한 나에게 말한다 that.proxyRequired(settings.url) true를 반환하는) .

모든 입력 사항을 매우 높이 평가합니다.

+0

jquery의 최소화되지 않은 버전을 사용하여 호출합니다. – asawyer

+0

@asawyer 나는 잠시 동안 JQuery를 보면서 잠깐 보냈다. 파이어 폭스와 IE는 내 요청이 크로스 도메인 (??)이지만 파이어 폭스가'JQuery.support.cors'에 대해 false를 반환한다고 생각할 때까지 true를 반환합니다. 이것이 갈라지는 곳입니다. 이것이 문제라면, 두 브라우저 중 어느 쪽이 요청이 도메인 간이라고 생각하는지, 심지어 전체 프록시 URL (도메인 포함)을 테스트하고 대상 URL에서 'http : //'를 제거했을 때의 이유를 모르겠다. – tomfumb

답변

1

당신은 내가 JQuery.ajax 기능의 beforeSend 콜백 (proxy.beforeRequestSend)에 프록시 URL을 앞에 추가하고 내 질문의 코드에서 볼 수 있듯이 :

이 다른 유래 질문을 참조하십시오. 이 함수가 실행될 즈음에 JQuery는 이미 요청을 검사하여 그것이 크로스 도메인이라고 결정했다.

결과적으로 JQuery는 모든 요청이 로컬 프록시로 전달되었지만 모든 내 요청을 상호 도메인으로 취급하고있었습니다. JQuery는 CORS를 지원하지 않기 때문에 IE와 Opera에서 도메인 간 요청을 거부했습니다.

다행히도 crossDomain 속성은 settings 개체의 beforeSend 콜백으로 전달되며 쉽게 변경할 수 있습니다.

this.beforeRequestSend = function(XHR, settings) { 

    if(that.proxyRequired(settings.url)) { 
    settings.url = 'proxy/?target=' + encodeURIComponent(settings.url); 
    settings.crossDomain = false; 
    } 
}; 
1

프록시 작업이 ajax 호출에 대한 응답으로 리디렉션을 보내고 있습니까? 브라우저는 자동으로 리디렉션을 따르므로 XHR이 XSS 시도를 감지하는 이유가 될 수 있습니다. jQuery는 IE9에서 CORS를 지원하지 않으므로 오류가 발생합니다. Cross-origin Ajax requests don't work in Opera and IE9?

+0

좋은 제안이지만 아니요, 프록시가 리디렉션되지 않습니다. 위의 요청과 같이 IE를 종료하지 않았습니다. – tomfumb

3

자바 스크립트에서 $를 호출하기 전에.아약스 (또는 동급) 강제 교차 도메인 동작 :

JQuery.support.cors=true; 
관련 문제