[419] [DFN[[CODE(HTTP)[[[404]]]]]] ([DFN[[[Not Found]]]])
は、[[対象資源]]が存在しないか、存在を明確にしたくないことを表します。

* 仕様書

[REFS[
- [414] '''[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.5.4>'''
- [413] [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.5.3>
- [1] [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.1>
- [4] [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#appendix-D>
- [5] [CITE@en[RFC 5789 - PATCH Method for HTTP]] ([TIME[2014-09-22 15:11:26 +09:00]] 版) <http://tools.ietf.org/html/rfc5789#section-2.2>
]REFS]

* 意味

[416] [CODE(HTTP)[[[404]]]] は、[[起源鯖]]が[[対象資源]]の現在の[[表現]]を見つけられなかったか、
その存在を明らかにしたくないことを表します [SRC[>>414]]。

[412] [[起源鯖]]は、[[対象資源]]の存在をも隠したいときは、
[CODE(HTTP)[[[403]]]] ではなく [CODE(HTTP)[[[404]]]] を使っても構いません [SRC[>>413]]。

[417] [CODE(HTTP)[[[404]]]] は、[[対象資源]]の[[表現]]の不存在が一時的なものか、
永続的なものかは示しません。永続的なものであろうと[[起源鯖]]が分かっている時は、
[CODE(HTTP)[[[410]]]] がより好ましいです [SRC[>>414]]。

* 文脈

[2] [CODE(HTTP)@en[[[PROPFIND]]]] [[要求]]に対する[[応答]]の [CODE(XMLe)@en[[[multistatus]]]]
[[要素]]中の [CODE(XMLe)@en[[[status]]]] では、指定された[[特性]]が存在しなかったことを表すために使います [SRC[>>1]]。

[3] [[LNR]] が[[対象資源]]である時、特定の[[要求メソッド]]以外では 
[CODE(HTTP)[[[405]]]] [[応答]]を返すことができます [SRC[>>4]]。

[6] [CODE(HTTP)@en[[[PATCH]]]] [[要求]]の[[対象資源]]が存在しない時、
新しい[[資源]]を作成しても構いませんが、 [CODE(HTTP)[[[404]]]]
[[応答]]を返すこともできます [SRC[>>5]]。

* 処理

[418] [CODE(HTTP)[[[404]]]] [[応答]]は、[[キャッシュ可能]]です [SRC[>>414]]。

* ソフト404

[8] 
[[Web業界]]の一部では[[Webページ]]が[DFN[ソフト404]]であるか否かということがあります。

[9] 例えば [[Google Search Console]] がこの語を使っています。

[10] 
[[ソフト404]]は、実際の[[状態符号]]は [CODE[404]]
ではないものの、
当該[[Webページ]]内容が[[要求URL]]の不存在を表したと判断されたことを意味しています。

[11] 
指定された[[Webページ]]が存在しないにも関わらず、
[[状態符号]]が適切に設定されないことが少なくないため、
そのような概念が実装されています。

[EG[
[12] 
例えば次のような理由で[[状態符号]]が適切に設定されないことがあります。

- [13] [[著者]]の [[HTTP]] の知識が不足しているため
- [14] いわゆる [[SPA]] 方式で[[クライアント側レンダリング]]しているため、
[[サーバー]]が[[応答]]する時点で[[状態符号]]を決定できないため
]EG]

[15] 
[[ソフト404]]かどうかの判定は[[発見的]]手法で行われます。
実際にはページが存在するにも関わらず、
[[ソフト404]]と判定されてしまうことも珍しくありません。

;; [16] それで[[検索エンジン]]の[[索引]]から除外されたりしてしまうのですから、
困ったものです。

[EG[
[17] 
例えばエラーについて説明した[[Webページ]]が[[ソフト404]]判定されることがあります。
エラーに関する語句の出現が判定に関与しているためと思われます。

[18] 
ただし [[Google検索]]の場合、語句の出現だけを単純に見ているわけではなさそうです。

]EG]

[REFS[
- [19] 
[CITE@ja[[[ソフト 404 エラー]]を修正する方法 | Google 検索セントラル | ドキュメント | Google Developers]], [TIME[2022-04-25T14:59:27.000Z]], [TIME[2022-06-22T01:39:30.743Z]] <https://developers.google.com/search/docs/advanced/crawling/soft-404-errors?visit_id=637914574445510299-2479369229&rd=1>
]REFS]

* 歴史

[FIG(quote)[
[FIGCAPTION[
[415] RFC 1945 (HTTP/1.0); RFC 2068 & 2616 (HTTP/1.1) 10.4.5 404 Not Found
]FIGCAPTION]

> The server has not found anything matching the Request-URI. No
indication is given of whether the condition is temporary or permanent.

サーバーは [CODE(ABNF)[[[Request-URI]]]] と一致するものを見つけられませんでした。
条件が一時的なものか永続的なものかの案内はありません。

>[DEL[[INS[{1945,2068}]] If the server does not wish to make this information available to the client, the status code 403 ([DEL[[INS[{1945}]] forbidden]] [INS[Forbidden]]) can be used instead.]] [INS[[INS[{2068,2616}]] The 410 (Gone) status code SHOULD be used if the server knows, through some internally configurable mechanism, that an old resource is permanently unavailable and has no forwarding address.]] [INS[[INS[{2616}]] This status code is commonly used when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable.]]

;[DEL[サーバーがこの情報をクライアントに知らせたくないと思うのであれば、代わりに状態符号 [CODE(HTTP)[[[403]]]] (禁止) を使うことができます。]] [INS[何らかの内部的な設定機構によって、古い資源が永続的に利用不能となり、転送番地もないとサーバーが知っている時には、 [CODE(HTTP)[[[410]]]] (逝去) 状態符号を使用する'''べきです'''。 [INS[この状態符号 [INS[[INS[(訳注)]] [CODE(HTTP)[404]]]] は、要求を拒否する実際の理由を晒したくないとサーバーが思っている時や、他の応答が適当でない時に広く使われています。]]]]
]FIG]

[411] [CITE@en[RFC 7252 - The Constrained Application Protocol (CoAP)]]
( ([TIME[2014-06-27 00:59:37 +09:00]] 版))
<http://tools.ietf.org/html/rfc7252#section-5.9.2.5>

[420] [CITE@en[RFC 3507 - Internet Content Adaptation Protocol (ICAP)]]
( ([TIME[2014-06-08 07:17:07 +09:00]] 版))
<http://tools.ietf.org/html/rfc3507#section-4.3.3>

[FIG(quote)[
[FIGCAPTION[
[7] [CITE@ja-jp[「404」は部屋番号だった? 「Not Found」エラーにまつわる噂の真偽を、「生みの親」に聞いてみた|WIRED.jp]]
([TIME[2018-01-25 18:19:37 +09:00]])
<https://wired.jp/2018/01/25/history-of-the-404-error/>
]FIGCAPTION]

> 「404という数字は実は404号室に由来している」「その部屋は世界初のウェブサーヴァーが置かれたところで、スイスの欧州原子核研究機構(CERN)内にある」「ワールド・ワイド・ウェブ(WWW)を考案したティム・バーナーズ=リーがその部屋にオフィスを構えた」「彼はしょっちゅう行方をくらましていた」──といった具合だ。
> こうしたエピソードに「やれやれ」とため息をつくのは、ロバート・カイリューである。バーナーズ=リーとともにWWWを開発したひとりで、ハイパーテキスト構造をつくり、のちにウェブへと進化させた人物だ。
> そこでカイリューに、404エラーについてコメントを求めてみた。すると彼は「つまらない話」と一蹴し、気乗りしない様子で「そんな伝説はでたらめだ」と頑として譲らなかった。

]FIG]
