[解決済み] Preflightとredirectを使用したCORSリクエスト: 不許可になりました。回避策は?
質問
ユーザー認証(トークンを使用)が可能で、同一ドメイン内でのリダイレクトを含むAPIを設計しています。今、303を返すエンドポイントへの未認証のリクエストについて。
GET /documents/123 --> 303 redirect to `/documents/abc`
GET /documents/abc --> 200
は、すべてうまくいくのです。
と同じエンドポイントに認証付きでリクエストしてみましょう。
Authorization
ヘッダが送信されます。これにより、リクエストは
プリフライトされたリクエスト
を実行し、ブラウザはプリフライト
OPTIONS
リクエスト、すなわち
OPTIONS /documents/123 --> 204 (everything okay, please proceed)
GET /documents/123 --> 303 redirect to `/documents/abc`
この時点では、代わりに
GET
で実際のリソースを指定します。
/documents/abc
と表示され、ブラウザは
XMLHttpRequest cannot load http://localhost:8000/people/username/nschloe.
The request was redirected to 'http://localhost:8000/people/YDHa-B2FhMie',
which is disallowed for cross-origin requests that require preflight.
この動作は 標準 :
7.1.5 プリフライトを使用したクロスオリジンリクエスト
レスポンスの HTTP ステータスコードが 2xx 以外である場合
ネットワークエラーの手順を適用してください。
これは、1つの
はできません。
は、たとえリダイレクト先が同じドメインであっても、認証済みリソースのリダイレクトを行います (
localhost
).
本当にこんなことがあるのでしょうか?一般的な回避策はあるのでしょうか?
解決方法は?
元の標準では、CORS プリフライトが成功した後のリダイレクトは除外されています。 引用§7.1.5.3 :
これが実際のリクエストです。リクエストの手順を適用し、以下のリクエストルールを守りながらリクエストを行ってください。
- レスポンスのHTTPステータスコードが301、302、303、307、または308の場合 キャッシュとネットワークエラーの手順を適用します。
皆様のご尽力により(ありがとうございます!)、2016年8月4日に規格が 更新 を使用して、CORSプリフライトチェックに成功した後にリダイレクトを許可するようにしました。
ブラウザが追いつくまで、実現可能な選択肢は、1つまたはその組み合わせしかないようです。
- に対してのみリダイレクトを発行します。 シンプルリクエスト .
-
を発行します。
305リダイレクト
の中に、自分の URL を入れてください。
Location
ヘッダをプロキシとして使用します。305は非推奨であるため、サポートするブラウザが限られていることを覚悟しておいてください。 - 偽の "redirect" を実行します。
-
でHTMLを返します。
meta refresh
またはJavascriptLocation
を変更します。 -
は、ビューポートを埋め尽くすような HTML を返します。
iframe
で、iframe のソースとしてリダイレクト先を指定します。 - コンテンツにアクセスするためにユーザーがクリックする必要があるリンクを表示します。
関連
-
[解決済み】「プリフライトが無効です(リダイレクト)」または「プリフライト要求に対してリダイレクトは許可されていません」を解決する方法
-
[解決済み] HTTP GET(リクエストボディ付き
-
[解決済み] jQuery Ajax呼び出し後のリダイレクトリクエストを管理する方法
-
[解決済み] REST APIからデータを取得しようとしたときに、要求されたリソースに'Access-Control-Allow-Origin'ヘッダーが存在しない。
-
[解決済み] プリフライト要求に対する応答がアクセス制御チェックを通過しない
-
[解決済み] OPTIONSリクエストを送信する理由と、それを無効にする方法を教えてください。
-
[解決済み] HTTPとRESTの違いは何ですか?
-
[解決済み】プリフライトCORSリクエストの導入の動機は何ですか?
-
[解決済み】AngularJS がクロスオリジンリソースに対して OPTIONS HTTP リクエストを実行する場合
-
[解決済み] サーバーサイドでCookieを削除する正しい方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン