programing

XHR HEAD 요청이 리디렉션(301 302)을 따르지 않을 수 있습니까?

minecode 2023. 9. 2. 09:48
반응형

XHR HEAD 요청이 리디렉션(301 302)을 따르지 않을 수 있습니까?

리디렉션처럼 301,302를 자동으로 따르지 않고 첫 번째 요청에 대한 헤더 응답만 받기 위해 xhr HTTP HEAD 요청을 보낼 수 있습니까?저는 URL의 새로운 위치를 얻는 것에만 관심이 있습니다.예:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(data) {
    if (xhr.readyState == 4) {
        if (xhr.status == 301 || xhr.status == 302) {
            // Get new location url don't GET it
        }
    }
};
xhr.open('HEAD', url, true);
xhr.send();

http://www.w3.org/TR/XMLHttpRequest/ #structure-for-the-send-messages는 요청을 따라야 한다고 명시한 것 같은데, 이를 막을 방법이 있습니까?

아니요, 이건 노출된 행동이 아닙니다. 당신이 멈출 수 있는 것은 아닙니다.

이미 연결한 규격 때문에 지정된 동작은 XmlHttpRequest가 투명하게 리디렉션을 따라야 한다는 것입니다.불행하게도, 당신이 막을 수 있는 방법이 아닙니다.

자원이 이동하는 등의 상황을 더 쉽게 만들 수 있는 방법입니다.하지만 설계되고 사양이 제시되었을 때, 이러한 모든 리디렉션 서비스는 존재하지 않았습니다.이를 방지하기 위해 다른 동작이나 기능이 크게 필요하지는 않았습니다. 웹에 접근하는 리다이렉트가 많아지면 기능이 추가되지는 않겠지만, 모든 브라우저가 언제 이를 지원할지는 누가 알 수 있습니다.

W3C 사양에서는 다른 답변에서 @Nick이 제안한 것처럼 리디렉션이 자동으로 수행되어야 합니다.그러나 W3C는 사양의 향후 버전을 위해 리디렉션을 비활성화하는 속성을 고려하고 있습니다.

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

  • 부하 이벤트 및 부하 속성
  • 오류 이벤트 및 오류 속성
  • 진행 상황 및 진행 중 속성;
  • 중단 이벤트 및 중단 속성;
  • 타이머가 제안되었습니다. 아마도 시간 초과 속성일 것입니다.
  • 다음 리디렉션을 사용하지 않도록 설정할 속성;
  • 응답 X텍스트/html 문서용 ML;
  • 교차 사이트 XMLHttpRequest;
  • 바이트 스트림을 처리하기 위한 응답 본문;
  • MimeType을 재정의하여 MIME 유형을 수정합니다.
  • 요청 받기헤더() 및 요청 제거머리글().

하지만, 이것이 모든 브라우저에서 구현될 때까지 저는 숨을 쉬지 않을 것입니다.서버측 프록시를 사용하여 이 작업을 처리할 수 있습니다.간단한 스크립트를 작성하여 다음 작업을 수행합니다.HEAD원하는 서버 측 언어/프레임워크로 요청한 다음 Ajax를 사용하여 이 서비스를 쿼리합니다.또한 프록시를 통해 타사 도메인에 대한 요청을 긍정적인 부작용으로 수행할 수 있습니다.

그리고 이제 그것은 가능합니다! 적어도 파이어폭스와 크롬 브라우저에서.

저는 그 답을 발견했을 때 거의 절망적이었습니다: https://stackoverflow.com/a/8056313/995007 .

예:

    var xhttp = new XMLHttpRequest();
    xhttp.onload = function() {
        console.log(xhttp.responseURL); // Here you are!
    };
    xhttp.open('GET', 'https://www.ddd.com/news', true);
    xhttp.send();

리디렉션을 중지합니다.

리디렉션이 너무 많으면 주요 브라우저가 리디렉션을 중지합니다.크롬에서 오류 ERR_가 발생합니다.TOO_MANY_REDIRECTS는 20회 리디렉션 후입니다.다음과 같은 테스트 코드(redir.php로 저장):

<?php
$times = isset($_GET['t']) ? intval($_GET['t']) : 1;
if ( $times < 20) {
    header("Location: redir.php?t=".strval($times+1));
} else {
    header("Location: http://the.final.target.url/which.will.give.you.a.301.header.but.you.do.not.want.to.follow.it");
}

그러면 우리가 제외한 대로 리디렉션이 중지된다는 것을 알게 될 것입니다. 또및 xhr 일반 JS 작합다동과 및 합니다.(new Image).src="some.url".

한 가지 더, 최대 리디렉션 제한은 브라우저마다 다릅니다.당신은 redir로 그 번호를 테스트하고 찾을 수 있습니다.php를 직접 사용하거나 다음 항목에서 찾아보십시오.Chrome에서 "너무 많은" 리디렉션은 몇 개입니까?

도움이 된다면 다행입니다 :)

언급URL : https://stackoverflow.com/questions/3820663/is-it-possible-for-xhr-head-requests-to-not-follow-redirects-301-302

반응형