[412] [DFN[[CODE(HTTP)[[[301]]]]]] ([[Moved Permanently]]) は、
[[リダイレクト]]を表す[[状態符号]]です。一時的な[[リダイレクト]]ではなく、
今後も同じ新 [[URL]] を使うべきことをも表しています。

* 仕様書

[REFS[
- [403] '''[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.2>'''
- [302] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-3.1.1>
- [2] [CITE@en-US[Fetch Standard]] ([TIME[2015-07-07 18:54:30 +09:00]] 版) <https://fetch.spec.whatwg.org/#concept-http-fetch>
]REFS]

* 意味

[404] [CODE(HTTP)[[[301]]]] は、[[対象資源]]に新しい[RUBYB[永続的]@en[permanent]]
[[URL]] が割り当てられており、この[[資源]]に対する以後の参照には指定された [[URL]]
のいずれかを使う[RUBYB[べき]@en[ought to]]であることを表します [SRC[>>403]]。

* 文脈

[303] [[受信者]]は、[[非妥当]]な[[要求行]]を受信した時、 [CODE(HTTP)[[[400]]]]
を返すのでなければ、適切に[[符号化]]された[[要求対象]]に [CODE(HTTP)[[[301]]]]
[[リダイレクト]]する[[応答]]を返す[['''べきです''']] [SRC[>>302]]。

* 構文

[406] [[鯖]]は、 [CODE(HTTP)@en[[[Location:]]]] [[ヘッダー]]を[[生成]]して新しい永続的
[[URL]] の好ましい [[URL]] を指定する[['''べきです''']] [SRC[>>403]]。

[408] [[payload]] は、通常新しい [[URL]] (群)への[[ハイパーリンク]]を含む短い[[ハイパーテキスト]]のメモを含めます
[SRC[>>403]]。

* 処理モデル

[407] [[利用者エージェント]]は、 [CODE(HTTP)@en[[[Location:]]]]
[[ヘッダー]]の値を自動的な[[リダイレクト]]に使って[['''構いません''']] [SRC[>>403]]。

[405] [[リンク]]編集機能のある[[クライアント]]は、
[[実効要求URL]]への参照をできる限り[[鯖]]が指定した新しい参照へと自動的に置き換える[RUBYB[べき]@en[ought to]]です
[SRC[>>403]]。

[409] 歴史的理由により、[[利用者エージェント]]は、
次の[[要求]]の際に [CODE(HTTP)@en[[[POST]]]] を [CODE(HTTP)@en[[[GET]]]]
に変更して[['''構いません''']] [SRC[>>403]]。
[[Web互換性]]のためには、変更しなければ[['''なりません''']] [SRC[>>2]]。

;; [410] これが望ましくない時は、かわりに [CODE(HTTP)[[[307]]]] を使えます [SRC[>>403]]。

[411] [CODE(HTTP)[[[301]]]] [[応答]]は、[[キャッシュ可能]]です [SRC[>>403]]。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[401] RFC 1945 (HTTP/1.0); RFC 2068・2616 (HTTP/1.1) 10.3.2 301 Moved Permanently
]FIGCAPTION]

> The requested resource has been assigned a new permanent [DEL[URL]] [INS[URI]] and any future references to this resource [DEL[should]] [INS[SHOULD]] [DEL[[INS[{1945,2068}]] be done using]] [INS[[INS[{2616}]] use]] [DEL[that URL]] [INS[one of the returned URIs]].
Clients with link editing capabilities [DEL[[DEL[[INS[{1945}]] should]] [INS[[INS[{2068}]] SHOULD]]]] [INS[[INS[{2616}]] ought to]] automatically re[INS[-]]link references to the Request-URI to [INS[one or more of]] the new reference[INS[s]]
returned by the server, where possible. [INS[[INS[{2068,2616}]] This response is cach[INS[e]]able unless indicated otherwise.]]

要求された資源には新しい永続 URI が割り当てられており、
将来のこの資源への参照は全て返された URI の一つを使う'''べきです'''。
リンク編集機能のあるクライアントは、可能であれば、
[CODE(ABNF)[[[Request-URI]]]] をサーバーにより返された1つ以上の新しい参照に自動的に再リンクするべきです。
この応答は、別途指示されていない限りキャッシュ可能です。

> [DEL[[INS[[INS[{2068}]] If the new URI is a location, its]] [DEL[[INS[{1945}]] The new]] URL]] [INS[[INS[{2616}]] The new permanent URI]] [DEL[[INS[{1945,2068}]] must]] [INS[[INS[{2068,2616}]] SHOULD]]
be given by the Location field in the response.

新しい永続 URI は、応答の [CODE(HTTP)[[[Location]]]]
欄で与えられる'''べきです'''。

> Unless [DEL[it was a HEAD request]] [INS[the request method was HEAD]], the [DEL[Entity-Body]] [INS[entity]]
of the response [DEL[should]] [INS[SHOULD]] contain a short [INS[hypertext]] note with a hyperlink to the new [DEL[URL]] [INS[URI(s)]].

要求 method が [CODE(HTTP)[HEAD]] でない限り、
応答の実体は新しい URI (群) へのハイパーリンクが入った短いハイパーテキストの覚書を含む'''べきです'''。

> If the 301 status code is received in response to a 
request [DEL[[INS[{1945}]] using the POST method]] [DEL[[INS[[INS[{2068,2616}]] other than GET or HEAD]]]] [INS[[INS[{errata}]] method that is known to be "safe", as defined in section 9.1.1, then the request MAY be automatically redirected by the user agent without confirmation.  Otherwise]], the user agent [DEL[must not]] [INS[MUST NOT]]
automatically redirect the request unless it can be confirmed by the user, since this might
change the conditions under which the request was issued.

「安全」とわかっている method については、利用者エージェントは要求を確認なしに自動的に redirect しても'''構いません'''。
それ以外の場合には、
利用者エージェントは利用者が確認することなしに自動的に redirect
しては'''なりません'''。そうでないと、要求が発行された条件を変更してしまうかもしれないからです。

> Note: When automatically redirecting a POST request after receiving
a 301 status code, some existing [INS[HTTP/1.0]]
user agents will erroneously change it into a GET request.

注意 : [CODE(HTTP)[301]] 状態符号を受信して [CODE(HTTP)[[[POST]]]]
要求を自動的に redirect するときに、誤って [CODE(HTTP)[GET]]
要求に変えてしまう HTTP/1.0 利用者エージェントが存在します。

[INS[
注 : 特に注記のない修正は、 RFC 1945 → RFC 2068 のもの
(削除部 = 1945, 挿入部 = 2068)。
]INS]
]FIG]

[REFS[
- [1] [Errata] <http://purl.org/NET/http-errata#saferedirect>
]REFS]

[402] [CITE@en[HTTP - WHATWG Wiki]]
( ([TIME[2013-12-19 01:12:07 +09:00]] 版))
<http://wiki.whatwg.org/wiki/HTTP#Redirects>

* 関連

[413] よく使われる[[リダイレクト]]の[[状態符号]]には [CODE(HTTP)[[[302]]]]
もあります。 [CODE(HTTP)[[[302]]]] は一時的な[[リダイレクト]]であり、
今後も必要なら元の [[URL]] にアクセスするべきことを意味しています。