/
64.txt
85 lines (61 loc) · 4.65 KB
/
64.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
[2] [CODE(HTTP)[[[3xx]]]] [[応答]]で他の [[URL]] を指定し、[[利用者エージェント]]にその
[[URL]] に[[要求]]を送信することを求めること、あるいはそのような[[応答]]のことを、
[DFN[[RUBYB[[[リダイレクト]]]@en[redirect]]]]といいます。
* 仕様書
[REFS[
- [306] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-6.4>
- [518] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-4.3.4>
]REFS]
* 構成要素
[305] [[HTTPリダイレクト]]は、次の[[プロトコル要素]]により構成されます。
[FIG(short list)[
- [[状態符号]] [CODE(HTTP)[[[3xx]]]]
- [CODE(HTTP)@en[[[Location:]]]] [[ヘッダー]]
]FIG]
* 処理モデル
[307] [[要求メソッド]]が[[安全]]でない場合、自動的な[[リダイレクト]]には注意する必要があります。
[[利用者]]は[[安全]]でない[[要求]]を[[リダイレクト]]してほしくないかもしれません。 [SRC[>>306]]
[308] [CODE(HTTP)@en[[[Location:]]]] があれば、
未対応の [CODE(HTTP)[[[3xx]]]] [[状態符号]]であっても、
自動的に[[リダイレクト]]して構いません [SRC[>>306]]。
[517] [[起源鯖]]は、 [CODE(HTTP)@en[[[PUT]]]] [[要求]]に対して[[対象資源]]の状態を変更せず、
他の[[資源]]に適用したい場合は、
適切な [CODE(HTTP)[[[3xx]]]] [[応答]]を送信し[['''なければなりません''']]。
その場合[[利用者エージェント]]は[[リダイレクト]]に従うか選ぶことができます。 [SRC[>>518]]
* リダイレクトループ
[523] [[クライアント]]は、[[リダイレクト]]の循環を検出して対処する[['''べきです''']]
[SRC[>>518]]。
;; [524] なぜ [['''MUST''']] でなく [['''SHOULD''']] なのか謎です。
無限[[リダイレクト]]で[[無限ループ]]するような[[クライアント]]はどう考えてもバグっており、
有害でしかありません。
;; [525] [[RFC 2068]] は最大5回までとしており、注意が必要 [SRC[>>518]] です。
* 歴史
[519] [[リダイレクト]]には、元々の[[要求]]の[[要求対象]]を書き換え、
[[要求メソッド]]を維持するパターンと、[[要求メソッド]]を [CODE(HTTP)@en[[[GET]]]]
に書き換えるパターンがあります。
[520] [[HTTP]] 仕様書の著者の意図は、 [CODE(HTTP)[[[301]]]] と [CODE(HTTP)[[[302]]]]
は前者とするものでしたが ([[CERN]] の実装もそうなっていました)、
実際には [CODE(HTTP)[[[303]]]] 共々後者の動作とする実装があり、
やがて後者に収束していきました。 [SRC[>>306]]
[521] このため後者の意味の [CODE(HTTP)[[[307]]]] が新たに追加されました。
更に、[[要求メソッド]]が [CODE(HTTP)[[[POST]]]] だった場合のみ、
[CODE(HTTP)[[[301]]]] と [CODE(HTTP)[[[302]]]] で前者の動作でも[[適合]]することとされました。
[SRC[>>306]]
;; [522] [[HTTP]] の仕様書の著者の意図としては、依然として [CODE(HTTP)[[[301]]]]
と [CODE(HTTP)[[[302]]]] は元の[[要求メソッド]]のまま[[リダイレクト]]するのが正しい使い方のようです。
15年以上にわたり安定している現在の慣習と互換性のない“理論上は正しい”
方式にこだわり続ける意図が何なのかは謎です。 [[Webブラウザー]]も[[鯖]]側の
[[Webアプリケーション]]も、 [CODE(HTTP)[[[301]]]] や [CODE(HTTP)[[[302]]]]
で[[要求メソッド]]が保持されることなど想定しておらず、
そうでない実装方法は決して[[Web互換]]では無いのですが・・・。
* 実装
[1] [CITE@ja[リダイレクトの設定とインデックスに登録されるURL - インフォセンター - Yahoo!検索]]
([TIME[2010-05-25 10:35:59 +09:00]] 版)
<http://info.search.yahoo.co.jp/archives/002865.php>
* 関連
[3] 通常は [[HTTPリダイレクト]]とは呼びませんが、 [CODE(HTTP)@en[[[Refresh:]]]]
[[ヘッダー]] (や [CODE(HTML)@en[[[<meta http-equiv=refresh>]]]] も[[リダイレクト]]を実現するものです。
[4] また[[リダイレクト]]には [[JavaScript]] によって[[クライアント]]側で実行する手法もあります。
[5] [[HTTP]] の仕様書は、 [CODE(HTTP)[[[300]]]] や [CODE(HTTP)[[[304]]]]
も[[リダイレクト]]と呼んでいます。
;; [CODE(HTTP)[[[3xx]]]] の項を参照。