🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

1回答

7826閲覧

fetchで自前でリダイレクトを対応する方法

nicht-sein

総合スコア12

JavaScript

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

0グッド

0クリップ

投稿2019/11/05 10:25

やりたいこと

fetch でヘッダーに設定していた認証情報が Safari でリダイレクトが発生時に消えてしまうので、自動でリダイレクトをさせないで、手動で認証情報をヘッダーに設定させたいと考えています。

fetch の第二引数の初期化引数になにか設定をしなければいけないのかと思い調べていたところ、

javascript

1const r = await fetch(url, {redirect:'manual'})

と指定すればfetch内で自動リダイレクトが行われず、手動でリダイレクトを行うことができるという記述が見つかったのですが、
実際に redirect: manual と指定して、リダイレクトを行うサンプルが見つからず、手探りで試してみるもうまくいきません。

発生事象

manual設定時にリダイレクトが起きるとurlにリダイレクト先のURLが設定されているResponseが渡されるのですが、そのurlプロパティにはリダイレクト先のurlではなく、リダイレクト前のアクセスurlが設定されていて、リダイレクト先が取得できません。

また、うまくリダイレクトが停止されていないようで、ブラウザ(Chrome)のネットワークログには アクセスをキャンセルしました のようなログが残っています。

再現コード

具体的には下記のようなコードを試しています。

javascript

1const fetchOption = { 2 headers: { 3 Authentication: "bearer XXXXXXXXXXXXXXXXXXXXXXXX", 4 }, 5 redirect: 'manual', 6} 7 8function handleRedirect(r) { 9 if (r.type == 'opaqueredirect') { 10 // リダイレクトの時は opaqueredirect になる。リダイレクト先は url に入っている(はず) 11 return fetch(r.url, fetchOption) 12 } else { 13 return r 14 } 15} 16 17fetch(url, fetchOption) 18 .then(res => handleRedirect(res)) 19 .then(res => res.json()) 20 .then(json => console.log(json)

こちら、redirect: 'manual' 指定時に手動でリダイレクトを行う方法についてご存じの方がいらっしゃったらご教授お願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/11/05 10:42 編集

> Safari でリダイレクトが発生時に消えてしまう の状況がよくわかりません 具体的にどうリダイレクトして、何がきえるのでしょうか? また現象はげSafariのみで確認できるのでしょうか?
nicht-sein

2019/11/05 10:50

再現コードの通り、ヘッダーにAuthenticationを付加しているのですが、 リダイレクト後のアドレスにアクセスする際の、リクエストヘッダーにはAuthenticationが存在せず、認証エラーとなっています。 現象はMacとiPhoneのSafariのみで発生しており、ChromeやFirefoxでは問題なくリダイレクト後のアドレスにもAuthenticationヘッダーを付与してアクセスしています。 Authenticationヘッダーがなくなっているのはアクセスログ及びデベロッパーツールのネットワークタブから確認しています。
guest

回答1

0

自己解決

https://code-examples.net/ja/q/28bcbb2

こちらの情報によると ServiceWorker を使ってバックグラウンドで fetch を利用する以外には redirect: 'manual' の利用する必要はない、とのことで、
私の目的(redirect時に独自の処理を行う)には仕様できないということが分かりました。

Safariを動作対象外にすることは難しいので、実装側でリダイレクトが発生しないように対処するしかないようですね。

投稿2019/11/05 14:21

nicht-sein

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問