質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • JavaScript

    16957questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jQuery

    6915questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

jQueryのAjaxでリダイレクト先URLを取得したい

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 6,841

Asmape

score 38

jQueryの$.ajaxを利用して、リダイレクトさせるようなページにアクセスしているのですが、リダイレクト先のURLを取得する方法はありますか?XMLHttpRequestだとresponseURLというのがあるようですが、$.ajaxのcompleteの第一引数には見当たらないので…。わかる方教えてください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

It seems like this is only exposing responseURL on the platforms where it is supported, but not attempting to do any cross-browser normalization. If that is the case, I would prefer not to add it because it would be another difference that would need to be documented in the already-complicated $.ajax API docs. 

What exactly is being returned as responseURL? I couldn't tell from the spec. Is it the Location: header?
Fix #15173: Support responseURL attribute for jqXHR by xKerman · Pull Request #1615 · jquery/jquery · GitHub

ということらしいです。英語苦手なんですが、「IEがそのプロパティに対応していないのでブラウザ互換のため対応しない方がいいのでは」「Locationヘッダを使えばいいのでは」ということですかね。

追記

コメントを受けて追記します。

var xhr
$.ajax('http://example.com',{
  complete:function(){console.log(xhr.responseURL)},
  xhr:function(){return xhr = new window.XMLHttpRequest();}
});


このようなやり方で、XMLHttpRequestオブジェクトが取得できました。
なお、これはブラウザ互換を破壊してると思いますのでそのあたりはご確認ください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/24 08:14

    リダイレクト自体を$.ajaxが勝手に処理してしまうようで、301とか302のときにcomplete等々は実行されないようなんですが…

    キャンセル

  • 2016/03/24 13:55

    追記しました。

    キャンセル

  • 2016/03/24 20:18

    出来ました!!ありがとうございます!!!

    キャンセル

  • 2016/03/24 20:36

    ブラウザ互換以外のものも破壊しているかもしれません。ご使用は慎重に願います。

    キャンセル

0

リダイレクトはいくつか方法があると思うのですが、どのリダイレクトでしょうか。

 HTTPリダイレクト

HTTP 301 もしくは HTTP 302 の時に Location ヘッダで得られます。
レスポンスヘッダを参照するだけなら HEAD メソッドで十分ですね。

if (xhr.status === 301 || xhr.status === 302) {
  console.log(xhr.getResponseHeader('Location')); // リダイレクト先
}

 HTMLのmeta要素

HTMLのmeta要素でもリダイレクト可能です。該当meta要素ノードのcontent属性値からリダイレクト先を参照します。

<meta http-equiv="refresh" content="0;URL=http://example.com/">

 JavaScriptのlocation

JavaScriptの location.href や location.replace() でもリダイレクト可能です。
JavaScriptコードは様々なので固定的な方法ではリダイレクト先を得られません。
サイト毎のコードの特徴を見極めて正規表現で頑張って下さい。

 サーバサイドスクリプトで実装する

実際のところはJavaScriptで参照しやすいようにサーバサイドスクリプトでリダイレクト先を予めJavaScriptコードに埋め込むなり、APIを用意するのが妥当だと思います。
リダイレクタが余所様のサイトである場合はいろいろと問題がありそうなので目的が分かるまでは明言は控えます。

Re: Asmape さん

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/24 08:16

    リダイレクト自体はできるのですが、リダイレクト先のURLを取得したいのです。一番上のやつをcompleteに突っ込んでみたのですが、できませんでした。302の時にはcompleteを実行しないようです。

    キャンセル

  • 2016/03/24 08:53 編集

    302なら statusCodeで拾えませんか。
    http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings

    キャンセル

  • 2016/03/24 13:06

    いや、まず302のときにcompleteなりsuccessなりに処理が回ってこないので…

    キャンセル

  • 2016/03/24 19:16

    ですので、completeではなく、statusCodeで取れませんか?

    キャンセル

  • 2016/03/24 19:52

    …?completeに指定するfunctionの引数のxhrのstatusCode()ではないのですか?

    キャンセル

  • 2016/03/24 19:53

    think49 さん、仕様を読むと明記されてる感じではないんですが、XMLHttpRequest自体でリダイレクトを処理してるようですね。301の応答をクライアントに返すわけではないみたい。
    https://xhr.spec.whatwg.org/#states
    の状態の説明に、All redirects (if any) have been followed and all HTTP headers of the response have been received. とあります。

    キャンセル

  • 2016/03/24 22:10 編集

    To: Asmape さん
    > …?completeに指定するfunctionの引数のxhrのstatusCode()ではないのですか?
    意図したコードは下記です。詳しくは今朝掲示した「jQuery API Documentation」をお読み下さい。
    jQuery.ajax({statusCode:{302: function () {}}});

    To: Lhankor_Mhy さん
    未検証ですが、HEADメソッドでもリダイレクトされてしまうのか、興味があります。
    ちょっと時間が無いので今日は試せませんが…。

    キャンセル

  • 2016/03/24 22:23

    test

    キャンセル

-1

普通にリダイレクトしませんか?
もしかしてサーバが302を返さないとか・・・。

ちなみに1.4から

success: function(data, status, xhr)

みたいな書き方で、xhrでステータスチェックできますね。

if ( xhr.status === 302 ) { ~

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/23 16:55

    あーごめんなさい、質問勘違いして答えてしまいました。
    スルーしてください。

    ぺこり。

    キャンセル

  • 2016/03/23 16:56

    あ、はいw

    キャンセル

  • 2016/03/23 17:33

    あざっすー!
    今後気をつけます!

    キャンセル

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16957questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jQuery

    6915questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。