Impedir o redirecionamento de Xmlhttprequest

112

É possível evitar que o navegador siga redirecionamentos ao enviar XMLHttpRequest-s (ou seja, obter o código de status de redirecionamento de volta e tratá-lo sozinho)?

Zim
fonte

Respostas:

102

Não de acordo com o padrão W3C para o objeto XMLHttpRequest (ênfase adicionada):

Se a resposta for um redirecionamento HTTP:

Se a origem da URL transmitida pelo cabeçalho Location for a mesma origem da origem XMLHttpRequest e o redirecionamento não violar as precauções de loop infinito, siga o redirecionamento de forma transparente enquanto observa as regras de evento de solicitação de mesma origem.

Eles estavam considerando isso para um lançamento futuro:

Esta especificação não inclui os seguintes recursos que estão sendo considerados para uma versão futura desta especificação:

  • Propriedade para desativar os seguintes redirecionamentos;

mas a especificação mais recente não menciona mais isso.

Boy Baukema
fonte
5
O que é ridículo é quando o redirecionamento transparente envolve sobrescrever alguns cabeçalhos HTTP que foram definidos na solicitação original. Especificamente, se o cabeçalho "Aceitar" foi definido para um tipo de conteúdo específico, o Firefox falha em incluir este cabeçalho ao seguir o redirecionamento (o que torna um pouco mais difícil desenvolver serviços da web totalmente baseados em REST que usam este cabeçalho ... resmungar).
ruquay
1
Algumas pesquisas mais me trouxeram este relatório de bug bastante antigo: bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay
2
Concordo, falha de design totalmente ridícula.
Rasive
35

O novo Fetch API suporta diferentes modos de tratamento de redirecionamento: follow, errore manual, mas não consigo encontrar uma maneira de ver o novo URL ou o código de status quando o redirecionamento foi cancelada. Você apenas pode interromper o redirecionamento em si, e então parecerá um erro (resposta vazia). Se isso é tudo de que você precisa, você está pronto para ir. Além disso, você deve estar ciente de que os pedidos feitos através desta API não são canceláveis ainda . Eles estão agora.

Quanto a XMLHttpRequest, você pode acessar HEADo servidor e inspecionar se o URL mudou:

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

Você não obterá o código de status, mas encontrará o novo URL sem baixar a página inteira dele.

do utilizador
fonte
Às vezes, usar OPTIONSpode ser uma escolha melhor, de qualquer forma, só funciona para fins não gerais, etc. o administrador configurou o redirecionamento de todo o site / esquema, como HTTP -> HTTPS
William Leung
12

Você pode usar a responseURLpropriedade para obter o destino de redirecionamento ou verificar se a resposta foi finalmente obtida de um local que você aceita.
Isso, é claro, significa que o resultado é obtido de qualquer maneira, mas pelo menos você pode obter as informações necessárias sobre o destino do redirecionamento e, por exemplo, detectar condições em que deseja descartar a resposta.

Roland Pihlakas
fonte
11

Não, você não existe nenhum lugar na API exposto por XMLHttpRequest que permite que você substitua seu comportamento padrão de seguir um 301 ou 302 automaticamente.

Se o cliente estiver executando o IE no Windows, você poderá usar o WinHTTP para definir uma opção para evitar esse comportamento, mas essa é uma solução muito limitadora.

AnthonyWJones
fonte