1. ホーム
  2. redirect

[解決済み] URL フラグメントと 302 リダイレクト

2022-06-30 06:42:13

質問

よく知られているように、URL フラグメント (URLの末尾の # の後の部分) がサーバーに送信されないことはよく知られています。

しかし、サーバーのリダイレクト(HTTP ステータス 302 と Location: ヘッダによる) サーバーリダイレクトが関与している場合、フラグメントはどのように機能するのでしょうか。

私の質問は実に2つあります。

  1. もし元のURLがフラグメント( /original.php#foo ) があり、リダイレクト先が /new.php にリダイレクトされた場合、元のURLのフラグメント部分は単に失われるのでしょうか?それとも、新しい URL に適用されることもあるのでしょうか?

    新しいURLはこれまで /new.php#foo になるのでしょうか?

  2. 元の URL に関係なく、サーバーが新しい URL にリダイレクトする際に、フラグメント ( /new.php#foo を含む新しい URL にリダイレクトした場合、フラグメントは尊重されるのでしょうか? それとも、サーバーは本当にフラグメントにまったく干渉する必要がないのでしょうか? /new.php ??

どのように解決するのですか?

2014年6月27日更新 :

RFC 7231、ハイパーテキスト転送プロトコル (HTTP/1.1)。セマンティクスとコンテンツ は、PROPOSED STANDARD として公開されました。からは 変更履歴 :

<ブロッククオート

Location ヘッダフィールドの構文が変更され、すべての 相対参照やフラグメントを含むすべての URI 参照を許可するように変更されました。 また、フラグメントの使用が適切でない場合について、いくつかの明確化が行われました。 を明確にした。 (セクション 7.1.2)

からの重要なポイントは 7.1.2節 所在地 :

3xx(Redirection)レスポンスで提供されたLocationの値が、フラグメントコンポーネントを持たない場合 がフラグメントコンポーネントを持たない場合、ユーザーエージェントはその値がURIのフラグメントコンポーネントを継承しているかのように のフラグメントコンポーネントを継承しているかのように処理しなければならない。 のフラグメントコンポーネントを継承するものとしてリダイレ クトを処理しなければならない(すなわち、リダイレクションは元の参照のフラ グメントを継承する)。 は元の参照のフラグメントを継承する (もしあれば)。

例えば という URI 参照の GET リクエストが生成されたとします。 "http://www.example.org/~tim" に対して生成されたGETリクエストは、303 (See Other) レスポンスが返されるかもしれません。

Location: /People.html#tim

にリダイレクトすることを示唆しています。 "http://www.example.org/People.html#tim"。

同様に、URI参照で生成されたGETリクエストは "http://www.example.org/index.html#larry" に対して生成された GET リクエストは、ヘッダー フィールド: 301 (Moved Permanently)レスポンスが返されるかもしれません。

Location: http://www.example.net/index.html

にリダイレクトすることを提案します。 "http://www.example.net/index.html#larry" にリダイレクトすることを示唆し、元の にリダイレクトすることを示唆します。

これは明らかにあなたの質問に答えているはずです。

アップデート終了

の未解決(未指定)問題です。 現在の HTTP 仕様 の 2 つの問題で扱われています。 IETF httpbis ワーキンググループ :

#6 では Location ヘッダで使用することができます。#43はこう言っています。

いろいろなブラウザでテストしてみたところ

  • Firefox と Safari は、ロケーションヘッダでフラグメントを使用します。
  • Opera は、ソース URI が存在する場合はそのフラグメントを使用し、そうでない場合はリダイレクト先のフラグメントを使用します。
  • IE (8) は、ロケーション URI のフラグメントを無視し、存在する場合はソース URI のフラグメントを使用します。
<ブロッククオート

提案です。

<ブロッククオート

"注意:元のURIからのフラグメント識別子とリダイレクトを組み合わせる必要がある場合の動作は未定義です。現在のユーザーエージェントは、どのフラグメントが優先されるかで実際に異なります。

<ブロッククオート

[...]

<ブロッククオート

どうやらIE8の からフラグメント ID を使用するようです。 Location (を使用します(私が見た動作はlocalhostに限られるかもしれません)。

<ブロッククオート

このように、Safari/IE/Firefox/Chrome(今テストしました)では、元のURIが何であっても、Locationヘッダーのフラグメントが使用されるという一貫した動作があるようです。

したがって、私は私の提案を文書化するために変更します。 その を期待される動作として文書化することに変更します。

これは、あなたの質問に対する最もブラウザ互換性があり、将来性のある(この問題は最終的に標準化されるため)答えにつながります。

A: のフラグメントは破棄されます。

B: のフラグメントは Location ヘッダは尊重されます。