Byteful Startup Program: Free Bandwidth and Founder Pricing for Startups
BlogRFC 9209 Proxy-Status Header: What It Is and How to Read It

RFC 9209 Proxy-Status Header: What It Is and How to Read It

RFC 9209 Proxy-Status Header.png

The Proxy-Status HTTP response header, standardized in RFC 9209, goes beyond HTTP status codes. This header lets intermediary servers, including proxies, gateways, and CDNs, report how they handled a response, errors, and other contextual information

This explainer discusses Proxy-Status briefly, what can be reported, how to debug, and how it differs from other similar headers.

What is a Proxy-Status value?

Defined by RFC 9209, Proxy-Status is an HTTP Response Header Field that enumerates intermediary servers’ response handling, including errors. This applies to both proxy types, forward and reverse, with the sole objective of simplifying debugging by relaying more details than mere HTTP status codes.

Proxy-Status is represented as a list, with each member indicating responses by intermediary servers in chronological order, from the origin server to the client. We will take the same example illustrated in RFC 9209 before elaborating further:

Proxy-Status: revproxy1.example.net, ExampleCDN

Diagram of an HTTP response passing from the origin server through revproxy1.example.net and ExampleCDN to the client, with the resulting Proxy-Status header listing both intermediaries in hop order

In this field, the two listed members represent two hops, with “revproxy1.example.net” being closer to the origin server and “ExampleCDN” stationed adjacent to the client. This is the simplest instance without any additional information, which an intermediary could've added using a semicolon. However, the below-mentioned is a much richer response showing a 429 error generated by the intermediary server, r34.example.net (not the CDN or the origin):

HTTP/1.1 429 Too Many Requests

Proxy-Status: r34.example.net; error=http_request_error, ExampleCDN

Diagram of a 429 Too Many Requests response generated by r34.example.net and passed through ExampleCDN, with a Proxy-Status header showing error=http_request_error

Although this header field makes it convenient for the developers to troubleshoot errors, sending Proxy-Status is up to the intermediary server’s discretion. One might configure proxy servers to relay such lists with every response or selectively. Furthermore, every entry must either be a String or Token, and should indicate the underlying deployment/service. Hostname, IP address, service name, etc., can make for suitable Proxy-Status members.

RFC 9209 asks intermediary servers to preserve existing members and suggests appending Proxy-Status fields with their own information. However, these servers can handle Proxy-Status otherwise if explicitly configured, such as for removing certain members for privacy reasons. Likewise, origin servers have no say in generating Proxy-Status. If a problem surfaces only after the header is sent (say, mid-stream), an intermediary that already added its entry to the header can send a Proxy-Status trailer field with updated details for that entry.

What can a proxy report?

RFC 9209 defined five standard parameters, and the list is extensible: a sixth, next-hop-aliases (RFC 9532), has since joined the IANA registry. The following table summarizes each parameter, with explanations below.

ParameterValue typeWhat it tells youExample
errorTokenProblem obtaining the responseHTTP/1.1 504 Gateway TimeoutProxy-Status: ExampleCDN; error=connection_timeout
next-hopString or TokenThe intermediary or origin server selected as the next hopnext-hop=backend.example.org:8001
next-protocolToken or byte sequenceThe TLS ALPN protocol identifier for the connection to the next hopnext-protocol=h2
received-statusIntegerThe HTTP status code received from the next hopreceived-status=200
detailsStringAdditional implementation-specific diagnostic informationdetails="Malformed response header"

In addition to the above, RFC 9209 has defined multiple cases (discussed later) that can be reported with the error parameter. Some of these error types account for proxy DNS timeouts, generic DNS errors, destination IP prohibited or unroutable, connection refused or terminated, TLS protocol error, etc. The document also outlines a procedure for registering new HTTP error types, which can be used after approval.

Put simply, error identifies a failure category, next-hop the selected destination, received-status the HTTP status code from the next-hop, and details can provide additional information. Besides, next-protocol is the reported protocol used for reaching the next hop, labeled with an ALPN identifier. But keep in mind that every Proxy-Status value is a claim you can’t verify from the response alone.

Reading the Error Types

Four Proxy-Status error type groups: finding the destination, connecting, the HTTP exchange, and the proxy itself, each with example error types and their HTTP status codes

RFC has documented 32 error types originally. However, it has been extended afterward (e.g., incremental_refused, added in 2026), and the current full list you can check out at the IANA registry. For simplicity, we categorized these errors into four groups and listed the major types in the following table.

GroupWhat went wrongRepresentative types (recommended status)
Finding the destination (dns_, destination_)The proxy couldn't resolve the destination, select a usable next hop, or reach the destination because of routing or access restrictions.dns_timeout (504); dns_error (502); destination_not_found (500); destination_unavailable (503); destination_ip_prohibited (502); destination_ip_unroutable (502)
Connecting (connection_, tls_)The proxy identified the next hop but couldn't establish, secure, or maintain the connection.connection_refused (502); connection_timeout (504); connection_terminated (502); connection_read_timeout (504); tls_certificate_error (502); tls_protocol_error (502)
The HTTP exchange (http_)The HTTP request or response encountered an error, timeout, protocol violation, or other limitation.http_request_error (applicable 4xx); http_request_denied (403); http_response_timeout (504); http_protocol_error (502); http_response_incomplete (502)
The proxy itself (proxy_)The intermediary encountered an internal failure or configuration problem, detected a forwarding loop, or generated a response itself.proxy_internal_error (500); proxy_configuration_error (500); proxy_loop_detected (502)

Importantly, some error types (such as proxy_internal_error and http_protocol_error) are generic fallbacks used when no specific registered type fits the problem.

On top of that, an intermediary can choose to avoid sharing confidential details (such as backend hostnames and ports) in insecure environments. Lastly, an upstream server might generate the response, and errors can also be conveyed via HTTP trailers. Therefore, treat Proxy-Status as guidance and troubleshoot only based on factual evidence.

How to read Proxy-Status when a request fails

Though RFC 9209 outlines the header format and parameters, it sheds no light on how to debug. Therefore, we summarized the following pointers on problem identification, checking modified responses, and inspecting the next hop.

  1. Find the intermediary: Look for the entry that carries an error parameter. This is the first step, which becomes important if there are multiple intermediary servers in the network chain. Here, remembering the order (leftmost is closer to the origin) can come in handy. But please note that this order only shows the hop’s position and has nothing to do with which proxy server encountered the problem.
  2. Identify the error: The next obvious step is to match the value of the error parameter (e.g., connection_timeout) against IANA’s HTTP Proxy Error Types registry. Also, check received-status for every intermediary and compare it with the final response status to identify where the status might have changed.
  3. Inspect next-hop and next-protocol: This assists with step-by-step investigation and validating the network chain. It reveals the specific protocols used to connect to the respective next hops, as reported by the proxy servers. If these parameters are absent, use proxy configuration and logs to find the upstream path.

Three steps to read a Proxy-Status header: find the intermediary, identify the error in the IANA proxy error types, and inspect the next hop

Let’s take an example from the RFC itself.

HTTP/1.1 504 Gateway Timeout

Proxy-Status: ExampleCDN; error=connection_timeout

This represents that the CDN couldn’t connect to the next hop and is reporting a connection error. In this case, verify whether the next hop is reachable by other means. If the next hop is the origin, check the origin directly; if it is another intermediary, work through the chain using the debugging steps in our proxy timeout troubleshooting guide.

Where it sits among Via, Server, and vendor debug headers

Via, server, and vendor-specific debug headers handle similar intermediary communications, more or less. However, Proxy-Status presents them in a more standardized manner, while giving the intermediary autonomy to share details as per the security landscape. The following table compares them briefly on who adds these headers, what they contain, and whether they are mandatory.

HeaderWho adds itWhat it recordsIs it required?
Proxy-StatusHTTP intermediaries, including forward proxies, reverse proxies, and CDNsIntermediary's response handling. Can include an error type and other detailsNo. The header and its parameters are optional.
ViaProxies and gatewaysThe protocol version and intermediary identifier for each forwarding hop.A proxy must add it to messages it forwards.
ServerThe origin serverInformation about the software handling the request at the origin server.No.
Vendor-specific headers (e.g., Cf-Ray, Cf-Cache-Status)The relevant service providerProvider-specific information. For example, Cf-Ray supplies a request identifier, while Cf-Cache-Status describes cache handling.Depends on the provider and header.
FAQs

RFC 9209 Proxy-Status Header FAQs

FAQs
cookies
Use Cookies
This website uses cookies to enhance user experience and to analyze performance and traffic on our website.
Explore more