[309] [DFN[[CODE(HTTP)[[[307]]]]]] ([DFN[[[Temporary Redirect]]]]) は、
同じ[[要求メソッド]]で別の [[URL]] にアクセスするべきことを表す[[状態符号]]です。
[[HTTPリダイレクト]]の一種です。

;; [4] 通常は [CODE(HTTP)[[[302]]]] が使われるため、 [CODE(HTTP)[[[307]]]]
は滅多に見られません。

* 仕様書

[REFS[
- [308] [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.7>
]REFS]

* 意味

[310] [CODE(HTTP)[[[307]]]] は、[[対象資源]]が一時的に異なる [[URL]]
にあり、[[利用者エージェント]]はその [[URL]] に自動的に[[リダイレクト]]する場合には[[要求メソッド]]を変更しては[['''ならない''']]ことを表しています
[SRC[>>308]]。

[311] [[リダイレクト]]は後から変わるかもしれませんから、
[[クライアント]]は以後の[[要求]]でも元の[[実効要求URL]]
を使い続ける[RUBYB[べき]@en[ought to]]です [SRC[>>308]]。

;; [312] [CODE(HTTP)[[[308]]]] では[[リダイレクト]]先の [[URL]]
を以後は使うべきとしています。

* 構文

[313] [[鯖]]は、異なる [[URL]] を含む [CODE(HTTP)@en[[[Location:]]]]
[[ヘッダー]]を[[生成]]する[['''べきです''']] [SRC[>>308]]。

[316] [[payload]] は通常[[リダイレクト]]先 [[URL]] への[[ハイパーリンク]]を含む短い[[ハイパーテキスト]]のメモを含みます
[SRC[>>308]]。

* 文脈

[3] [[Chrome]] の[[開発者ツール]]は [[HSTS]] による[[リダイレクト]]を
[CODE(HTTP)[[[307]]]] [[応答]]として表示します。 [TIME[2015-05-12T13:51:55.700Z]]

* 処理

[314] [[利用者エージェント]]は、 [CODE(HTTP)@en[[[Location:]]]]
[[ヘッダー]]の値を自動的な[[リダイレクト]]に使って構いません [SRC[>>308]]。

[315] 自動的に[[リダイレクト]]する場合、[[要求メソッド]]を変更しては[['''なりません''']]
[SRC[>>308]]。

;; [317] [CODE(HTTP)[[[302]]]] では[[要求メソッド]]を [CODE(HTTP)[[[POST]]]] から
[CODE(HTTP)@en[[[GET]]]] に変更してもよいとされています。

* 関連

[7] 
一般的な[[リダイレクト]]には [CODE[302]] が使われます。

[8] 
[CODE[302]] よりも [CODE[307]] を使うべき理由はほとんどありません。
特別な事情がなければ [CODE[302]] で十分です。

* 歴史

[2] この応答符号は [CODE(HTTP)[[[302]]]] が濫用されてきたために新設されました。その辺の事情の説明は[[リダイレクト]]を参照してください。

[FIG(quote)[
[FIGCAPTION[
RFC 2616 (HTTP/1.1) 10.3.8 307 Temporary Redirect
]FIGCAPTION]

> The requested resource resides temporarily under a different URI.
Since the redirection MAY be altered on occasion, the client SHOULD
continue to use the Request-URI for future requests.  This response
is only cacheable if indicated by a Cache-Control or Expires header field.

要求された資源は一時的に異なる URI のもとにあります。
[RUBY[再指向] [リダイレクション]]は時節により変わっても'''構わない'''ので、
クライアントは将来の要求に対しても[INS[[INS[(訳注)]]元の要求に使った]]
[CODE(ABNF)[[[Request-URI]]]] を使い続ける'''べきです'''。
この応答は、 [CODE(HTTP)[[[Cache-Control]]]] 頭欄又は
[CODE(HTTP)[[[Expires]]]] 頭欄で示された場合のみキャッシュ可能です。

> The temporary URI SHOULD be given by the Location field in the
response. Unless the request method was HEAD, the entity of the
response SHOULD contain a short hypertext note with a hyperlink to
the new URI(s) , since many pre-HTTP/1.1 user agents do not
understand the 307 status. Therefore, the note SHOULD contain the
information necessary for a user to repeat the original request on the new URI.

一時 URI は応答の [CODE(HTTP)[[[Location]]]] 欄で与える'''べきです'''。
要求の method が [CODE(HTTP)[[[HEAD]]]] でない限り、応答の実体は新しい URI (群)
へのハイパーリンクの入った短いハイパーテキスト覚書を含む'''べきです'''。
なぜなら多くの HTTP/1.1 以前の利用者エージェントは [CODE(HTTP)[307]]
状態を理解しません。
従って、覚書は利用者が元の要求を新しい URI
に対して繰り返す必要があるという情報を含める'''べきです'''。

> If the 307 status code is received in response to a request [DEL[[INS[{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 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 の要求に対する応答で
[CODE(HTTP)[307]] 状態符号を受取った時は、
利用者エージェントは要求を確認なしに自動的に redirect
しても'''構いません'''。そうでない場合は、
利用者エージェントは利用者の確認を得ずに要求を自動的に再指向しては'''なりません'''。
再指向によって要求が発行された条件が変わってしまうかもしれないからです。
]FIG]

[1] [Errata] <http://purl.org/NET/http-errata#saferedirect>

[FIG(quote)[
[FIGCAPTION[
[5] [CITE@en[Google APIs - Global domain errors  |  YouTube Data API  |  Google Developers]]
( ([TIME[2015-05-21 03:44:24 +09:00]]))
<https://developers.google.com/youtube/v3/docs/core_errors#TEMPORARY_REDIRECT>
]FIGCAPTION]

> TEMPORARY_REDIRECT (307)

]FIG]


[6] [CITE@en[Avoid using the CORS flag to reset request's origin in redirects by annevk · Pull Request #594 · whatwg/fetch]]
([TIME[2018-06-01 01:02:28 +09:00]])
<https://github.com/whatwg/fetch/pull/594>