[9] [[状態符号]] [DFN[[CODE(HTTP)[[[504]]]]]] は、[[串]]や[[関門]]として動作している時に[[上流]]の[[鯖]]との接続が時間切れになったり、何らかの理由で接続しなかったりしたことを示します。

* 仕様書

[REFS[
- [6] '''[CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-09-11 09:52:09 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-6.6.5>'''
- [2] [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-5.2.1.7>
- [4] [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-5.2.2.1>
]REFS]

* 意味

[7] [CODE(HTTP)[[[504]]]] は、[[鯖]]が[[関門]]や[[串]]として動作したいる時に、
[[要求]]を完了させるためにアクセスする必要がある[[上流]]の[[鯖]]からの[[応答]]を良いタイミングで[[受信]]できなかったことを示す[[状態符号]]です
[SRC[>>6]]。

[8] 仕様書で例示されている[[理由句]]は「Gateway Timeout」ですが、
タイムアウトだけではなく、[[キャッシュ検証]]に失敗、または意図的に実行しなかった場合であっても、
この[[状態符号]]を返す場合があります。

* 文脈

[3] [[要求]]に [CODE(HTTP)@en[[[Cache-Control:]] [[only-if-cached]]]] が指定されていて[[キャッシュ]]が[[蓄積された応答]]を持たない場合に、
[CODE(HTTP)[[[504]]]] [[応答]]を使うこととなっています [SRC[>>2]]。

[5] [[蓄積された応答]]に [CODE(HTTP)@en[[[Cache-Control:]] [[must-revalidate]]]] や
[CODE(HTTP)@en[[[Cache-Control:]] [[proxy-revalidate]]]]
が指定されていて[[検証]]できなかった場合に、
[CODE(HTTP)[[[504]]]] [[応答]]を使うこととなっています [SRC[>>4]]。

[12] 
[[ELB]] は、[[上流]]の[[サーバー]]が[[応答]]を返さずに[[接続][HTTP接続]]を切った時、
[CODE[504]]
[[応答]]を返します。
[[応答本体]]は空になります。
[TIME[2020-04-15T13:27:02.800Z]]

* 歴史

[FIG(quote)[
[FIGCAPTION[
[10] RFC 2068・RFC 2616 (HTTP/1.1) 10.5.5 504 Gateway Timeout
]FIGCAPTION]

> The server, while acting as a gateway or proxy, did not receive a
timely response from the upstream server [DEL[it accessed]] [INS[specified by the URI (e.g. HTTP, FTP, LDAP) or some other auxiliary server (e.g. DNS) it needed to access]]
in attempting to complete the request.

関門又は串として動作しているサーバーは、要求を完了させようとする過程で[DEL[接続した]][INS[接続する必要のあった、 URI により指定された (例えば [[HTTP]], [[FTP]], [[LDAP]] の) 又は他の補助的な (例えば DNS の)]]
上流サーバーから適時応答を受信することができませんでした。

[INS[

> Note: Note to implementors: some deployed proxies are known to
return 400 or 500 when DNS lookups time out.

注意 : 実装者への注意 : 実際に使われている串の中には、 [[DNS]]
索きの時間切れの時に [CODE(HTTP)[[[400]]]] 又は [CODE(HTTP)[[[500]]]]
を返すものがあることが分かっています。
]INS]
]FIG]

[501] [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.3.5>

[1] この[[状態符号]]は、 [[RFC1945]] では規定されていませんでしたから、
[[HTTP/1.0]] の実装や古い [[HTTP/1.1]] の実装は知らないかもしれません。


[505] [CITE[Status codes in HTTP]]
( ([TIME[1999-10-27 03:40:19 +09:00]] 版))
<http://www.w3.org/Protocols/HTTP/HTRESP.html#z12>

[FIG(quote)[
[FIGCAPTION[
[11] [CITE@en[HTTP 504: Timeout · Bonsai]]
([TIME[2018-01-06 01:17:21 +09:00]])
<https://docs.bonsai.io/docs/http-504>
]FIGCAPTION]

> Our global request timeout is 60 seconds. A connection that takes longer than that to process, whether being served by Elasticsearch or waiting in a connection queue, will respond with a HTTP 504 timeout error after 60 seconds.

]FIG]
