[313] [CODE(HTTP)[[[300]]]] は、複数の代替[[表現]]が存在することを示す[[状態符号]]ですが、
あまり使われていません。

* 仕様書

[REFS[
- [303] '''[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.1>'''
- [6] [CITE@en[RFC 7168 - The Hyper Text Coffee Pot Control Protocol for Tea Efflux Appliances (HTCPCP-TEA)]] ([TIME[2014-10-12 17:41:43 +09:00]] 版) <http://tools.ietf.org/html/rfc7168#section-2.3.1>
- [10] [CITE@en[RFC 2295 - Transparent Content Negotiation in HTTP]] ([TIME[2014-08-31 19:36:42 +09:00]] 版) <http://tools.ietf.org/html/rfc2295#section-10.1>
]REFS]

* 意味

[304] [CODE(HTTP)[[[300]]]] は、[[対象資源]]が1つ以上の[[表現]]を持ち、
それぞれが独自の[[識別子]]を持っており、その[[識別子]]に[[要求]]を[[リダイレクト]]することで[[利用者]]
(または[[利用者エージェント]]) が好ましい[[表現]]を選択することができるような情報が提供されていることを示します。すなわち、[[鯖]]は[[利用者エージェント]]に [[reactive negotiation]]
によって最適な[[表現]]を選ぶことを求めていることを表します。 [SRC[>>303]]

* 構文

[305] [[鯖]]が[RUBYB[好ましい]@en[prefer]]選択肢を有する時は、
その [[URL]] を含む [CODE(HTTP)@en[[[Location:]]]] を[[生成]]する[['''べきです''']] [SRC[>>303]]。

[307] [[鯖]]は、[CODE(HTTP)@en[[[HEAD]]]] 以外の[[要求メソッド]]の場合、
[[利用者]]または[[利用者エージェント]]が最も好ましい[[表現]]を選べるような[[表現メタデータ]]と
[[URL]] の一覧を含んだ [[payload]] を[[生成]]する[['''べきです''']] [SRC[>>303]]。

[8] しばしば [CODE(HTTP)@en[[[Alternates:]]]] [[ヘッダー]]と併用されますが、
[CODE(HTTP)[[[300]]]] を使うために必須ではありません。

* 文脈

[11] [CODE(HTTP)[[[300]]]] は[[リスト応答]]に最も適切な[[状態符号]] [SRC[>>10]]
とされています。

[7] [CODE(HTTP)[[[300]]]] は [[HTCPCP-TEA]] で[[鯖]]が提供できる[[茶]]の種別を示すために
[CODE(HTTP)@en[[[Alternates:]]]] [[ヘッダー]]とともに用いられます [SRC[>>6]]。

* 処理モデル

[306] [[クライアント]]は、 [CODE(HTTP)[[[Location:]]]] [[ヘッダー]]があれば、
自動[[リダイレクト]]に使って[['''構いません''']] [SRC[>>303]]。

;; [314] 未知の [CODE(HTTP)[[[3xx]]]] [[状態符号]]は [CODE(HTTP)[[[300]]]]
と同じように扱うことが求められていますが、同時に [CODE(HTTP)@en[[[3xx]]]]
[[状態符号]]は [CODE(HTTP)@en[[[Location:]]]] により[[リダイレクト]]することも認められています。
従って >>306 は未知の [CODE(HTTP)[[[3xx]]]] [[応答]]にも適用されます。

[308] [[クライアント]]は、 [[payload]] の [[MIME型]]を理解できるなら、
>>307 のリストから自動的に選択しても[['''構いません''']] [SRC[>>303]]。

;; [309] ただしそのような[[MIME型]]を [[HTTP]] としては特に定義していません。
構文解析しやすい形式を選んでも構いませんし、
広く用いられている[[ハイパーテキスト]]形式を使っても構いません [SRC[>>303]]。

[310] [CODE(HTTP)[[[300]]]] [[応答]]は、[[キャッシュ可能]]です。

;; [311] かつて [CODE(HTTP)[[[URI:]]]] [[ヘッダー]]や [CODE(HTTP)@en[[[Alternates:]]]]
[[ヘッダー]]が提案されていましたが、広く[[相互運用]]可能に実装されることがなく、
[[HTTP]] 本体仕様書からは削除されています [SRC[>>303]]。

;; [312] [[HTTP]] 仕様書は [CODE(HTTP)@en[[[Link:]] ... [[rel]]=[[alternate]]]]
を使う可能性にも言及していますが、広く実装されるかには疑問も呈しています [SRC[>>303]]。


* 実装

[3] [[HTTP/1.0]] [[クライアント]]の中には [CODE(HTTP)[[[300]]]]
[[応答]]を黙って無視するものがある [SRC[>>10]] といわれています。

;; [12] そのため [CODE(HTTP)[[[300]]]] のかわりに [CODE(HTTP)[[[200]]]]
を使っても良いとされています。

[9] [[W3C]] の[[メーリングリスト]]の[[アーカイブ]]では、[[メッセージID]]
によって[[メール]]を表示する[[URL]]にアクセスした際、
複数の[[メーリングリスト]]に投稿された[[メール]]だった場合に、
各[[メーリングリスト]]における当該[[メール]]を表す [[URL]]
の一覧を含む[[HTML文書]]を [CODE(HTTP)[[[300]]]] [[応答]]で返します。

;; 特別な[[ヘッダー]]などは出力しないようです。


[1] 元々一般利用を考慮してなかったという歴史的背景もあってか、
この応答符号が使われているのはあまり見かけませんね。

あ、でも、 mod_なんとかとかいう、本来 404
でも似た URI を探してきて教えてくれる module,
あれで使ってますね。たまに見かけます。

[5] W3C なんかで実装してますね。例: <http://www.w3.org/TR/xhtml11/DTD/xhtml11.html>)。

[13] 
[[W3C]] 以外で使われているところはまったく見たことがないなあ。
使うべきだけど使っていないという事例すら見たことがない。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[302] RFC 1945 (HTTP/1.0); RFC 2068・2616 (HTTP/1.1) 10.3.1 300 Multiple Choices
]FIGCAPTION]

[DEL[

> [INS[{1945}]] This response code is not directly used by HTTP/1.0 applications,
but serves as the default for interpreting the 3xx class of responses.

この応答符号は HTTP/1.0 応用は直接使用しませんが、
[CODE(HTTP)[3[VAR[xx]]]] 級の応答の解釈の既定値として用意されています。
]DEL]

[INS[

> [INS[{2068,2616}]] The requested resource corresponds to any one of a set of
representations, each with its own specific location, and 
agent-driven negotiation information (section 12) is being provided so that
the user (or user agent) can select a preferred representation and
redirect its request to that location.

要求された資源は表現の集合のいずれとも対応し、
それぞれがそれぞれの位置を持ち、
エージェント駆動折衝情報が提供されており、
従って利用者 (又は利用者エージェント) 
は最善の表現を選択して要求をその位置に[RUBY[再指向] [リダイレクト]]できます。
]INS]

> The requested resource is available at one or more locations. Unless it was a HEAD request, the response [DEL[[INS[{1945}]] should]] [INS[[INS[{2068,2616}]] SHOULD]] include an entity
containing a list of resource characteristics and location[INS[(]]s[INS[) [INS[{2068}]]]] from
which the user or user agent can choose the one most appropriate. [INS[[INS[{2068,2616}]] The entity format is specified by the media type given in the Content-Type header field. Depending upon the format and the capabilities of the user agent, selection of the most appropriate choice [DEL[[INS[{2068 may]] [INS[[INS[{2616}]] MAY]] be performed automatically.  However, this specification does not define any standard for such automatic selection.]]]]

要求された資源は1つ以上の位置で利用可能です。
[CODE(HTTP)[[[HEAD]]]] 要求の場合を除いて、応答は、
利用者又は利用者エージェントが最適なものを選ぶための資源の特徴と位置の一覧を含んだ実体を含んでいる'''べきです'''。 [INS[実体の書式は [CODE(HTTP)[[[Content-Type]]]] 頭欄に与えられた媒体型で規定されます。その書式と利用者エージェントの能力に依り、最適な選択肢の選択を自動的に行っても'''構いません'''。しかし、この仕様書はこの自動選択の規格は定義しません。]]

> If the server has a preferred choice [INS[[INS[{2068,2616}]] of representation]], it [DEL[[INS[{1945}]] should]] [INS[[INS[{2068,2616}]] SHOULD]]
include the [INS[[INS[{2068,2616}]] specific]] [DEL[[INS[{1945,2068}]] URL]] [INS[[INS[{2616}]] URI]] [INS[[INS[{2068,2616}]] for that representation]] in a Location field;
user agents [DEL[[INS[{1945}]] may]] [INS[[INS[{2068,2616}]] MAY]] use [DEL[[INS[{1945}]] this]] [INS[[INS[{2068,2616}]] the Location]] field value for automatic redirection. [INS[[INS[{2068,2616}]] This response is cach[INS[e]]able unless indicated otherwise.]]

サーバーは[INS[表現の]]最適な選択肢を持っているなら、
その表現の特有の URI を [CODE(HTTP)[[[Location]]]] 欄に含める'''べきです'''。
利用者エージェントは [CODE(HTTP)[Location]] 欄の値を自動最指向に使用しても'''構いません'''。[INS[この応答は他で指定が無い限りキャッシュ可能です。]]
]FIG]

** HTCPCP

[REFS[
- [301] [CITE@en[RFC 7168 - The Hyper Text Coffee Pot Control Protocol for Tea Efflux Appliances (HTCPCP-TEA)]]
( ([TIME[2014-04-02 07:55:01 +09:00]] 版))
<http://tools.ietf.org/html/rfc7168#section-2.3.1>
]REFS]

* メモ

[2] 機械的選択って、 [CODE(HTTP)[[[Alternate]]]]
とかを使った[[内容折衝]]のことでしょうけど、
これこそ見たことがないです。

[4] [[透過内容折衝]]の[[目録応答]]の典型的な状態符号として [CODE(HTTP)[300]] が示されています。この場合は対応する利用者エージェントは [[RFC2295]] の規定に従って自動的に (利用者の手動の選択なしに) 適当な資源の表現を取り寄せることとなるかもしれません。

[315] [CITE@en[HTTP 300 - Add Alternates Header from RFC 2295]]
( ([TIME[2014-11-17 13:06:14 +09:00]] 版))
<http://burp.renderfarming.net/forum_thread.php?id=436>