Xmlhttprequest 리디렉션 방지


112

XMLHttpRequest-s를 보낼 때 브라우저가 리디렉션을 따르지 않도록 할 수 있습니까 (즉, 리디렉션 상태 코드를 다시 가져 와서 직접 처리)?

답변:


102

XMLHttpRequest 객체에 대한 W3C 표준을 따르지 않음 (강조 추가됨) :

응답이 HTTP 리디렉션 인 경우 :

Location 헤더가 전달하는 URL의 출처가 XMLHttpRequest 출처와 동일한 출처이고 리디렉션이 무한 루프 예방 조치를 위반하지 않는 경우 동일 출처 요청 이벤트 규칙을 준수하면서 리디렉션투명하게 따르십시오 .

그들은 향후 릴리스를 고려 하고 있었습니다 .

이 사양에는이 사양의 향후 버전에서 고려중인 다음 기능이 포함되어 있지 않습니다.

  • 다음 리디렉션을 비활성화하는 속성;

그러나 최신 사양은 더 이상 이것을 언급하지 않습니다.


5
어리석은 것은 투명한 리디렉션이 원래 요청에 설정된 일부 HTTP 헤더를 덮어 쓰는 것과 관련이 있다는 것입니다. 특히 "Accept"헤더가 특정 콘텐츠 유형으로 설정된 경우 Firefox는 리디렉션을 따를 때이 헤더를 포함하지 못합니다 (이 헤더를 사용하는 완전한 REST 기반 웹 서비스를 개발하기가 좀 더 어려워집니다 ... 불평).
ruquay

1
좀 더 검색하면 다소 오래된 버그 보고서가
나왔습니다

2
완전히 rediculus 디자인 결함에 동의하십시오.
Rasive 2014-12-12

35

새로운 API의 가져 오기 지원을 리디렉션 처리의 다양한 모드를 : follow, error,와 manual,하지만 난 재 지정이 취소 된 경우 새 URL 또는 상태 코드를 볼 수있는 방법을 찾을 수 없습니다. 리디렉션 자체를 중지하면 오류 (빈 응답)처럼 보입니다. 그게 전부라면 갈 수 있습니다. 또한이 API를 통해 이루어진 요청은 아직 취소 할 수 없습니다 . 그들은 있는 지금.

XMLHttpRequest의 HEAD경우 서버에서 URL이 변경되었는지 여부를 검사 할 수 있습니다 .

var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
    if (this.readyState === this.DONE) {
        console.log(this.responseURL);
    }
};
http.send();

상태 코드는받지 못하지만 전체 페이지를 다운로드하지 않고 새 URL을 찾습니다.


때로는 사용 OPTIONS하는 것이 더 나은 선택 일 수 있습니다. 어쨌든 비범 용적 용도로만 작동합니다. 관리자가 HTTP-> HTTPS
William Leung

12

responseURL속성을 사용 하여 리디렉션 대상을 가져 오거나 수락 한 위치에서 응답을 궁극적으로 가져 왔는지 확인할 수 있습니다.
이것은 물론 결과를 가져 오는 것을 의미하지만 최소한 리디렉션 대상에 대한 필요한 정보를 얻을 수 있으며 예를 들어 응답을 삭제하려는 조건을 감지 할 수 있습니다.



11

XMLHttpRequest에 의해 노출 된 API에는 301 또는 302를 자동으로 따르는 기본 동작을 재정의 할 수있는 위치가 없습니다.

클라이언트가 Windows에서 IE를 실행하는 경우 대신 WinHTTP를 사용하여 해당 동작을 방지하는 옵션을 설정할 수 있지만 이는 매우 제한적인 솔루션입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.