[12] [DFN[[CODE(HTTP)@en[[[HEAD]]]]]] [[メソッド]]は、[[資源]]の[[ヘッダー]]のみを返すことを[[要求]]するものです。

* 仕様書

[REFS[
- [24] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-07-01 17:07:49 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#page-22>
-- [11] '''[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.2>'''
-- [6] [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.2.1>
-- [8] [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.2.2>
-- [9] [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.2.3>
- [5] [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.3>
- [27] [CITE@en[RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching]] ([TIME[2014-09-11 10:19:59 +09:00]] 版) <https://tools.ietf.org/html/rfc7234#section-4.3.5>
- [40] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.4>
- [1] [CITE@en[RFC 3875 - The Common Gateway Interface (CGI) Version 1.1]] ([TIME[2011-11-20 06:09:05 +09:00]] 版) <http://tools.ietf.org/html/rfc3875#section-4.3.3>
- [42] [CITE@en-US[XMLHttpRequest Standard]] ([TIME[2015-01-14 22:14:17 +09:00]] 版) <https://xhr.spec.whatwg.org/#dom-xmlhttprequest-send>
- [43] [CITE@en-US[Fetch Standard]] ([TIME[2015-02-19 19:33:04 +09:00]] 版) <https://fetch.spec.whatwg.org/#dom-request>
]REFS]

* 意味

[36] [CODE(HTTP)@en[[[HEAD]]]] [[要求メソッド]]は、 [CODE(HTTP)@en[[[GET]]]]
[[要求メソッド]]が返すであろう[[応答]]の[[ヘッダー部]]のみを返すべきことを示します。

* 性質

[7] [CODE(HTTP)@en[[[HEAD]]]] [[メソッド]]は、[[安全なメソッド]]で [SRC[>>6]]、
[[冪等なメソッド]]です [SRC[>>8]]。

[10] [CODE(HTTP)@en[[[HEAD]]]] は、[[キャッシュ可能]]です [SRC[>>9, >>11]]。

* 構文

[14] [CODE(HTTP)@en[[[HEAD]]]] [[要求]]の [[payload]] の意味は定義されていません [SRC[>>11]]。

[15] 実装によっては [[payload]] がある[[要求]]を拒絶することがあります [SRC[>>11]]。

[44] [CODE(DOMi)@en[[[XMLHttpRequest]]]] および [CODE(DOMi)@en[[[Request]]]]
では、[[要求メッセージ]]の [[payload body]] を指定することはできません [SRC[>>42, >>43]]。

[16] [CODE(HTTP)@en[[[Content-Length:]]]] [[ヘッダー]]を指定することができますが、
[[メッセージ本体]]の長さではなく、 [CODE(HTTP)@en[[[GET]]]] [[要求]]だった場合に含まれるであろう
[[payload body]] の長さを表します。

;; [CODE(HTTP)@en[[[Content-Length:]]]] を参照。

* 文脈

[37] [[Webページ]]の[[更新チェック]]を行う[[利用者エージェント]]の中には、
[CODE(HTTP)@en[[[HEAD]]]] [[要求]]を送信して [CODE(HTTP)@en[[[Last-Modified:]]]]
の値を調べるものもあります。

[38] [CODE(HTTP)@en[[[Meter]]]] による[[キャッシュ]]の利用数の計測の仕組みでは、
[[串]]から[[鯖]]への計測数の報告に [CODE(HTTP)@en[[[HEAD]]]]
[[要求]]を使うことがあります。

* 処理

[25] 一般目的の[[鯖]]は、 [CODE(HTTP)@en[[[HEAD]]]] を実装しなければ[['''なりません''']]
[SRC[>>24]]。

;; [17] 実際には [[Web]] 上で普通に公開されている[[鯖]]であっても
[CODE(HTTP)@en[[[HEAD]]]] に対応しておらず [CODE(HTTP)[[[405]]]]
を返すことがあります。 ([[鯖]]は実装していて[[対象資源]]が実装していないだけだから仕様違反ではない、
とも解釈できるのでしょうか。いずれにせよ[[クライアント]]は[[鯖]]が
[CODE(HTTP)@en[[[HEAD]]]] に正しく[[応答]]することに依存できません。)

[2] [CODE(HTTP)@en[[[HEAD]]]] [[要求]]に対する[[応答]]は、
[[メッセージ本体]]を持ちません [SRC[>>5, >>11]]。

;; [3] [CODE(HTTP)@en[[[Content-Length:]]]] や [CODE(HTTP)@en[[[Transfer-Encoding:]]]]
や[[表現メタデータ]]を含んでいることもありますが、これらは [CODE(HTTP)@en[[[GET]]]]
[[要求]]だったとした場合の値であって、 [CODE(HTTP)@en[[[HEAD]]]] に対する[[応答]]の値ではありません。

[48] [CODE(HTTP)@en[[[HEAD]]]] [[要求]]に対する[[応答]]が [[HTTP/0.9]]
の場合、 [[Chrome]] も [[Firefox]] も [[IE]] も[[メッセージ本体]]が存在するものとして扱います。

[13] [[鯖]]は、 [CODE(HTTP)@en[[[GET]]]] [[要求]]だったとした場合に送られるのと同じ[[ヘッダー]]を[[応答]]に含めて送信する[['''べきです''']]。
ただし、 [[payload header]] は、省略して構いません。 [SRC[>>11]]

[41] [[WebDAV]] [[コレクション]]の場合でも、通常の[[資源]]と同じように処理することになっています [SRC[>>40]]。

[18] [CODE(HTTP)@en[[[GET]]]] への[[応答]]の[[キャッシュ]]を [CODE(HTTP)@en[[[HEAD]]]]
への[[応答]]のために用いることもできます。

[28] [[キャッシュ]]が [CODE(HTTP)@en[[[HEAD]]]] [[要求]]に対して
[CODE(HTTP)[[[200]]]] [[応答]]を受信した場合は、次のようにする[['''べきです''']] 
[SRC[>>27]]。

[FIG(steps)[
= [29] 相当する [CODE(HTTP)@en[[[GET]]]] [[要求]]に対する[[蓄積された応答]]を選択します。
= [32] 各[[応答]]について、
== [30] [[検証子]]が新しい[[応答]]と一致するもので、
[CODE(HTTP)@en[[[Content-Length:]]]] [[ヘッダー]]が新しい[[応答]]一致するもの
(またはどちらも同[[ヘッダー]]がない場合) について、
=== [33] [[蓄積された応答]]から[[警告符号]] [CODE(HTTP)[[[1xx]]]] の 
[CODE(HTTP)@en[[[Warning:]]]] [[ヘッダー]]があれば削除します。
=== [34] [CODE(HTTP)[[[304]]]] [[応答]]に含まれる[CODE(HTTP)@en[[[Warning:]]]]
以外の[[ヘッダー]]について、
[[蓄積された応答]]の対応する[[ヘッダー]]を置き換えます。
===- [35] ただし [CODE(HTTP)@en[[[Cache-Control:]]]] で制限されている場合を除きます。
== [31] それ以外の場合、[[蓄積された応答]]を[[腐敗]]とします。
]FIG]

* 歴史

[FIG(quote)[
[FIGCAPTION[
[4] RFC 1945 (HTTP/1.0) 8.2; RFC 2068 (HTTP/1.1) 9.4 HEAD
]FIGCAPTION]

> The HEAD method is identical to GET except that the server [DEL[must not]] [INS[MUST NOT]] return [DEL[any Entity-Body]] [INS[a message-body]]
in the response. The metainformation contained in the HTTP headers in response to a HEAD request [DEL[should]] [INS[SHOULD]]
be identical  to the information sent in response to a GET request. This method can be used for obtaining metainformation about the [DEL[resource identified]] [INS[entity implied]]
by the [DEL[Request-URI]] [INS[request]] without transferring the [DEL[Entity-Body]] [INS[entity-body]]
itself. This method is often used for testing hypertext links for validity,
accessibility, and recent modification.

[CODE(HTTP)[HEAD]] 方式は、サーバーが[[応答]]中で [CODE(ABNF)[[[message-body]]]]
を返しては'''ならない'''点を除いて、 [CODE(HTTP)[[[GET]]]] と同じです。
[CODE(HTTP)[HEAD]] 要求に対する応答の [[HTTP]] 頭並びに含まれる[[メタ情報]]は、
[CODE(HTTP)[GET]] 要求に対する応答で送られる情報と同じである'''べきです'''。
この方式は、要求で暗示した実体についてのメタ情報を
[CODE(ABNF)[[[entity-body]]]] 自体を転送せずに得ることができます。
この方式はしばしば[[ハイパーテキスト]]・[[リンク]]の妥当性,
接続可能性, 最近の修正の検査のために使われます。

[DEL[
> There is no "conditional HEAD" request analogous to the conditional
GET. If an If-Modified-Since header field is included with a HEAD
request, it should be ignored.

条件付 [CODE(HTTP)[GET]] に対応する「条件付 [CODE(HTTP)[HEAD]]」はありません。
[CODE(HTTP)[[[If-Modified-Since]]]] 頭欄が [CODE(HTTP)[HEAD]]
要求に含まれていても、無視するべきです。
]DEL]

[INS[
> The response to a HEAD request [DEL[may]] [INS[MAY]] be cach[INS[e]]able in the sense that the
information contained in the response [DEL[may]] [INS[MAY]] be used to update a
previously cached entity from that resource. If the new field values
indicate that the cached entity differs from the current entity (as
would be indicated by a change in Content-Length, Content-MD5, ETag
or Last-Modified), then the cache MUST treat the cache entry as stale.

[CODE(HTTP)[HEAD]] 要求に対する応答は、応答に含まれる情報を以前にその[[資源]]から[[キャッシュ]]した実体を更新するために使っても'''構わない'''という意味で[[キャッシュ可能]]です。
キャッシュした実体が現在の実体と異なることを新しい欄値が示していたら
([CODE(HTTP)[[[Content-Length]]]], [CODE(HTTP)[[[Content-MD5]]]],
[CODE(HTTP)[[[Content-MD5]]]], [CODE(HTTP)[[[ETag]]]] または
[CODE(HTTP)[[[Last-Modified]]]] の変更で示される)、
キャッシュはキャッシュ項目を[[腐敗]]したものとして扱わなければ'''なりません'''。
]INS]

]FIG]

[REFS[
- [45] [CITE@en[Disallow body when method is GET or HEAD for now https://www.w3.org/Bugs... · 3d9655c · whatwg/fetch]] ([TIME[2015-02-24 00:25:44 +09:00]] 版) <https://github.com/whatwg/fetch/commit/3d9655c4024e67fe4e20e8812e96e8ffa2b3cc0d>
]REFS]

* 実装

[19] [CODE(HTTP)@en[[[HEAD]]]] は、[[リンク先]]の存在確認や更新チェックなどの目的で使われることがあります。

[20] [CODE(HTTP)@en[[[HEAD]]]] は、[[本体]]が必要ない時に[[鯖]]の負荷の削減やネットワーク帯域の節約のために用いられることがあります。
ただし、[[鯖]]で動的に生成される[[資源]]が多いこんにち、 [CODE(HTTP)@en[[[HEAD]]]]
を用いることが負荷削減につながるかは怪しいところです。[[アプリケーション]]によっては
[CODE(HTTP)@en[[[HEAD]]]] を直接実装せずに、 [CODE(HTTP)@en[[[GET]]]]
と同様の処理をした結果から[[本体]]を除去して返すこともよくあります。

[21] 仕様上は [CODE(HTTP)@en[[[HEAD]]]] は実装しなければならないことになっていますが、
実際上は必ずしも実装されていません。実装されていたとしても、
[CODE(HTTP)@en[[[GET]]]] の場合と異なる結果を返すことがあります。

[22] そのため、 [CODE(HTTP)@en[[[HEAD]]]] のみで十分な情報が得られる場合であっても、
[CODE(HTTP)@en[[[GET]]]] を使うこともあります。

;; [23] 例えば [[HTML]] の [CODE(HTMLe)@en[[[title]]]] を取得したい場合のように、
[CODE(HTTP)@en[[[HEAD]]]] では十分な情報が得られず、 [CODE(HTTP)@en[[[GET]]]]
と[[範囲要求]]を用いた方が良いことも多々あります。

[26] [CITE[tus resumable upload protocol]]
( ([TIME[2014-06-23 00:14:49 +09:00]] 版))
<http://tus.io/protocols/resumable-upload.html#5-3-1>

[406] [CITE@en-US[wget –spider = Head Request : alexking.org]]
( ([TIME[2014-11-10 12:27:13 +09:00]] 版))
<http://alexking.org/blog/2005/03/11/wget-spider-head-request>

[52] [[ChromeDriver]] は [CODE[HEAD]] を実装していないようで、
[CODE[GET]] と同じように[[応答]]します。 [TIME[2017-03-19T11:02:38.0Z]]

* 関連

[39] [CODE(HTTP)@en[[[HEAD]]]] [[要求]]は[[条件付き要求]]とすることができます。
そのような[[要求]]を[[条件付きHEAD]]と呼ぶことがあります。

[46] [CITE@en[Fix #44 in a better way. (Avoid "extracting" undefined.) · whatwg/fetch@b33de72]]
([TIME[2015-04-15 23:07:26 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/b33de725823d1a2ab99708b717e83112e4ebeb6b>

[47] [CITE@en[Also throw when new Request() is passed a Request instance with a non-nu... · whatwg/fetch@5be0642]]
([TIME[2015-04-15 23:07:46 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/5be0642d1ad5b93ed8467ea9acc28f5786981599>

[49] [CITE@en[No longer include Content-Length for HEAD requests]]
([[annevk]]著, [TIME[2016-07-18 23:47:21 +09:00]])
<https://github.com/whatwg/fetch/commit/674b4d3f9606b22993bc61e135f2739b668c85a1>

[FIG(quote)[
[FIGCAPTION[
[50] [CITE@en[Webmention]]
([TIME[2017-01-11 04:06:01 +09:00]])
<https://webmention.net/draft/#h-sender-discovers-receiver-webmention-endpoint>
]FIGCAPTION]

> Senders may initially make an HTTP HEAD request '''['''RFC7231''']''' to check for the Link header before making a GET request.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[51] [CITE@en[Webmention]]
([TIME[2017-01-11 04:06:01 +09:00]])
<https://webmention.net/draft/#h-limits-on-get-requests>
]FIGCAPTION]

> Receivers may make an initial HTTP HEAD request when verifying the link and decide whether to make a full GET request after initially inspecting the content type, length, or other HTTP headers returned.

]FIG]


[53] [CITE@en[Expose Content-Length header in CORS requests · Issue #622 · whatwg/fetch]]
([TIME[2018-05-10 12:40:39 +09:00]])
<https://github.com/whatwg/fetch/issues/622>

[54] [CITE@en[Preserve HEAD method on 303 redirect]]
([[annevk]]著, [TIME[2018-08-17 23:27:58 +09:00]])
<https://github.com/whatwg/fetch/commit/6f29b764cc57aaf2f431e15a3f0fec029926e9e0>

[55] [CITE@en[303 redirects should preserve HEAD · Issue #753 · whatwg/fetch]]
([TIME[2018-08-23 18:51:28 +09:00]])
<https://github.com/whatwg/fetch/issues/753>

[56] [CITE@en[Preserve HEAD method on 303 redirect by annevk · Pull Request #796 · whatwg/fetch]]
([TIME[2018-08-23 18:52:40 +09:00]])
<https://github.com/whatwg/fetch/pull/796>