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)?

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.


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.


À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.



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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.