jQuery를 사용하여 URL을 가져오고 302 리디렉션으로 응답했는지 명시 적으로 확인하지만 리디렉션을 따르지 않고 싶습니다 .
jQuery $.ajax
는 항상 리디렉션을 따르는 것으로 보입니다. 이를 방지하고 따르지 않고 리디렉션을 보려면 어떻게해야합니까?
“jquery ajax redirect”와 같은 제목에 대한 다양한 질문이 있지만 모두 서버가 제공하는 상태를 직접 확인하는 것이 아니라 다른 목표를 달성하는 것과 관련된 것으로 보입니다.
답변
AJAX 요청은 리디렉션을 따르지 않을 기회가 없습니다 (즉, 리디렉션을 따라야 함). 자세한 내용은이 답변 https://stackoverflow.com/a/2573589/965648 에서 찾을 수 있습니다.
답변
미래에 오신 것을 환영합니다!
지금은 xhr 객체의 “responseURL”속성이 있습니다. 예!
XMLHttpRequest에서 응답 URL을 얻는 방법을 참조하십시오 .
그러나 jQuery (최소 1.7.1)는 XMLHttpRequest 객체에 대한 액세스를 직접 제공하지 않습니다. 다음과 같이 사용할 수 있습니다.
var xhr;
var _orgAjax = jQuery.ajaxSettings.xhr;
jQuery.ajaxSettings.xhr = function () {
xhr = _orgAjax();
return xhr;
};
jQuery.ajax('http://test.com', {
success: function(responseText) {
console.log('responseURL:', xhr.responseURL, 'responseText:', responseText);
}
});
깨끗한 솔루션이 아니며 jQuery 팀이 향후 릴리스에서 responseURL에 대해 뭔가를 만들 것이라고 생각합니다.
팁 : 원본 URL을 responseUrl과 비교하십시오. 같으면 리디렉션이 제공되지 않습니다. “정의되지 않음”이면 responseUrl이 지원되지 않을 수 있습니다. 그러나 Nick Garvey가 말했듯이 AJAX 요청은 리디렉션을 따르지 않을 기회가 없지만 responseUrl 속성 을 사용하여 여러 작업을 해결할 수 있습니다.
답변
이 질문에 답한 다른 사람들은이 정보가 브라우저에 의해 우리에게 숨겨져 있다는 사실이 (슬프게도) 정확하지만, 제가 생각해 낸 해결 방법을 게시 할 것이라고 생각했습니다.
X-Response-Url
요청 된 URL이 포함 된 사용자 지정 응답 헤더 ( ) 를 설정하도록 서버 앱을 구성했습니다 . 내 ajax 코드가 응답을받을 때마다이 xhr.getResponseHeader("x-response-url")
정의 되어 있는지 확인 하고,이 경우을 통해 원래 요청한 URL과 비교합니다 $.ajax()
. 문자열이 다르면 리디렉션이 있었고 추가로 실제로 도착한 URL이 무엇인지 알고 있습니다.
이것은 서버 측의 도움이 필요하다는 단점이 있으며, 왕복 중에 URL이 뭉쳐지면 (인용 / 인코딩 문제 등으로 인해) 고장날 수 있습니다 … 그러나 99 %의 경우에는 완료되었습니다.
서버 측에서 필자의 특정 사례는 Pyramid 웹 프레임 워크를 사용하는 Python 애플리케이션이었고 다음 스 니펫을 사용했습니다.
import pyramid.events
@pyramid.events.subscriber(pyramid.events.NewResponse)
def set_response_header(event):
request = event.request
if request.is_xhr:
event.response.headers['X-Response-URL'] = request.url