14

xhrリクエストへの応答が301のときに最終的にリダイレクトされるURLを取得する方法はありますか?

古いバージョンのレガシーURLが多数含まれているサイトがあり、正しい新しいURLに301の応答が返されます。

ユーティリティの目的で、古いURLにリクエストを送信し、新しいURLを取得できるようにしたいと思います。つまり、「/ oldpage.aspx?foo = someParam」にリクエストを送信し、新しいURL「/arbitaryNewPageName」を取得します。 /someParam」。

私はfirebugコンソールでこれをいじっています:

    $.ajax({
            url: "/oldpage.aspx?foo=someParam", 
            success: function(response, status, jqxhr){
            //poking around, trying to get the new URL, "/arbitraryNewPage/someParam"
                console.log(jqxhr.getAllResponseHeaders());
                console.log(jqxhr);
            },
            beforeSend: function(jqxhr, settings){
                console.log(jqxhr);
                console.log(settings);
            }
        });

このコードを実行すると、「/ oldpage.aspx?foo = someParam」に対して1回GETを実行し、301応答を取得してから、「/ ArbitaryNewPageName/someParam」に対して別のGETを実行することがfirebugでわかります。

最初のリクエストでは、レスポンスヘッダーのLocation値にリダイレクトされたURLが表示されます。残念ながら、2番目のリクエストは$ .ajax.success関数に渡されるものであり、リクエストヘッダーのReferrer値にリダイレクトされたURLしかありません。

最初の応答への応答をインターセプトする方法、または2番目の要求の要求ヘッダーを確認する方法はありますか?

編集:回答をありがとうございました。私が探しているものを正確に明確にするために、少し背景を説明する必要があると思います。

ビジネスユーザーから、従来のURLと新しいURLを関連付けるリストを作成するように依頼されました。レガシーURLをサーバー上の新しいURLにリダイレクトする手段をすでに実装しているので、その作業を便乗して、リクエストをレガシーURLに配置し、リクエストがリダイレクトされるURLを取得するスクリプトを作成したいと考えていました。このようなもの:

for (var i = 0; i < arrayOfLegacyUrls.length; i++)
{
    $.ajax({
            url: arrayOfLegacyUrls[i], 
            success: function(response, status, jqxhr){
                var newUrl = "???"; //do magic to get URL that request was redirected to

                writeToFileForBusinessUser(arrayOfLegacyUrls[i], newUrl);
            }
        });
}

私の質問の核心はこれです:私のリクエストがリダイレクトされたURLをXHRから取得できますか?これまでのところ、答えは「いいえ」のようです。

4

3 に答える 3

1

この回答から、jqueryのajaxメソッドの代わりに実際のXHRオブジェクトを使用してこれを行う方法を見つけました:https ://stackoverflow.com/a/7015798/194099

var r = new XMLHttpRequest();
r.open("GET", "http://mysite.com/legacyUrl.aspx?bla=bla");
r.overrideMimeType("text/xml");
r.onload = function()
{
  alert(r.responseXML.baseURI); //gets the URL the request was redirected to! huzzah!
}
r.send(null);

これにより、301を返すことがわかっているURLにリクエストを送信し、リクエストのリダイレクト先のURLを取得することができました。

于 2012-05-01T14:01:01.573 に答える
1

これは透過的に機能することを意図しており、少なくともここで提案されていることです。

Ajaxリダイレクトの処理Xmlhttprequestのリダイレクトの防止

実行できることの1つは、URLをコンテキストパラメーターとしてAJAX呼び出しに渡し、成功した場合は、応答URLをコンテキストオブジェクトのURLプロパティと比較することです。

コンテキストについては、こちらをご覧ください:http: //api.jquery.com/jQuery.ajax/#jQuery-ajax-settings

アップデート:

this.url本当にトリッキーなのは新しいURLです。econtextをオーバーライドしない場合は、呼び出すことで取得できると思います。

for (var i = 0; i < arrayOfLegacyUrls.length; i++)
{
    $.ajax({
        url: arrayOfLegacyUrls[i], 
        success: function(response, status, jqxhr){
            var newUrl = jqxhr.getResponseHeader("X-MYAPP-PATH");
            writeToFileForBusinessUser(arrayOfLegacyUrls[i], newUrl);
        }
    });
}
于 2012-05-01T00:25:17.037 に答える
1

XMLHttpRequest.responseURLをチェックしてください

于 2014-07-03T00:05:25.830 に答える