Standards and sources
The specifications, RFCs and official documentation ZigProxy is built on, what each one actually governs, and which is the current document to cite.
Proxy behaviour is defined across a surprisingly large set of documents, several of which have been obsoleted by newer ones that people still cite by the old number. This page is the index: what governs what, which document is current, and where the gaps are.
Core HTTP semantics#
The 2022 revision replaced the RFC 7230 to 7235 series. If you see a citation to RFC 7230 or RFC 2616, it is out of date, and in the case of RFC 2616 it has been obsolete since 2014.
| Document | Governs | Replaces |
|---|---|---|
| RFC 9110 | HTTP semantics: methods, status codes, header fields, intermediaries, CONNECT, Via, caching directives shared with RFC 9111 | RFC 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694 and parts of 7230; it also updates RFC 3864 |
| RFC 9111 | HTTP caching, Cache-Control, shared vs private caches, Vary | RFC 7234 |
| RFC 9112 | HTTP/1.1 message syntax, framing, Content-Length vs Transfer-Encoding precedence. Updated by RFC 9931 on optimistic protocol transitions | remainder of RFC 7230 |
| RFC 9113 | HTTP/2, pseudo-headers, HPACK usage, connection-specific header prohibition | RFC 7540 and RFC 8740 |
| RFC 9114 | HTTP/3 over QUIC | new |
| RFC 9204 | QPACK header compression for HTTP/3 | new |
| RFC 9000 | QUIC transport | new |
RFC 9112 section 6.3, "Message Body Length", is the specific text behind HTTP request smuggling: when a message carries both Content-Length and Transfer-Encoding: chunked, the Transfer-Encoding overrides the Content-Length, and an intermediary that chooses to forward the message must first remove the received Content-Length field. Section 6.1 is the Transfer-Encoding field definition itself.
Forwarding and client identity#
| Document | Governs | Status in practice |
|---|---|---|
| RFC 7239 | The Forwarded header: for, by, host, proto, obfuscated identifiers | Standardised, sparsely deployed. See the Forwarded header |
| RFC 9110 section 7.6.3 | The Via header, which every forwarding proxy is required to update | Widely implemented, widely ignored by tooling |
| The PROXY protocol specification | v1 text and v2 binary formats, TLV registry | Not an RFC. Maintained by HAProxy Technologies and implemented very widely. See the PROXY protocol |
| No specification | X-Forwarded-For, X-Real-IP, X-Forwarded-Proto, X-Forwarded-Host | De facto only. Behaviour differs between implementations, which is the subject of the X-Forwarded-For header |
That last row is the single most important fact on this page. The header the entire internet uses to identify clients has no normative definition, which is precisely why implementations disagree about ordering, duplication and trust.
Tunnelling and non-HTTP proxying#
| Document | Governs |
|---|---|
| RFC 9110 section 9.3.6 | The CONNECT method and tunnel establishment |
| RFC 8441 | Extended CONNECT for HTTP/2, which is how WebSockets work over HTTP/2 |
| RFC 9298 | Proxying UDP in HTTP, the CONNECT-UDP mechanism. Updated by RFC 9484 and RFC 9931 |
| RFC 9297 | HTTP Datagrams and the Capsule Protocol |
| RFC 1928 | SOCKS protocol version 5 |
| RFC 1929 | Username and password authentication for SOCKS 5 |
| RFC 6455 | The WebSocket protocol and its HTTP/1.1 Upgrade handshake |
Authentication#
| Document | Governs |
|---|---|
| RFC 9110 sections 11.7.1, 11.7.2 and 15.5.8 | Proxy-Authenticate and Proxy-Authorization are 11.7.1 and 11.7.2; 407 Proxy Authentication Required is 15.5.8 |
| RFC 7617 | The Basic authentication scheme, which with RFC 7616 and RFC 7235 obsoletes RFC 2617 |
| RFC 7616 | The Digest authentication scheme |
| RFC 4559 | SPNEGO-based Kerberos and NTLM in HTTP, the Negotiate scheme. Informational, not Standards Track |
TLS#
| Document | Governs |
|---|---|
| RFC 9846 | TLS 1.3, including post-handshake client authentication. Published in 2026, it obsoletes RFC 8446, which is the number most tooling and documentation still cites |
| RFC 5246 | TLS 1.2, obsoleted by RFC 8446 and now RFC 9846, still relevant for renegotiation-based client certificate behaviour |
| RFC 6066 | TLS extensions including Server Name Indication, the basis of SNI routing |
| RFC 8555 | ACME, the protocol behind automatic certificate issuance in Caddy and Traefik |
| RFC 9162 | Certificate Transparency version 2.0, which obsoletes RFC 6962, and why locally installed roots are exempt from it |
Addressing#
| Document | Governs |
|---|---|
| RFC 1918 | Private IPv4 address space, the usual content of a trusted proxy list |
| RFC 6598 | Shared address space 100.64.0.0/10, used by carrier-grade NAT and by several cloud load balancers |
| RFC 4291 | IPv6 addressing, including the IPv4-mapped form that breaks naive trust checks |
| RFC 6890, updated by RFC 8190 | The registry of special-purpose address blocks, the correct basis for an SSRF deny list |
Vendor documentation#
Configuration claims are checked against the official documentation for the version named in the text.
- nginx documentation and the
ngx_http_proxy_module,ngx_http_realip_module,ngx_http_upstream_moduleandngx_stream_ssl_preread_modulereferences - HAProxy configuration manual, which is versioned per branch
- Envoy documentation and the xDS API reference
- Caddy documentation
- Traefik documentation, noting that v2 and v3 differ in matcher syntax
- curl manual and the changelog, which is unusually precise about when behaviour changed
Where the gaps are#
Three areas that this site covers have no normative specification at all, which is worth knowing before you argue about correct behaviour with a vendor:
X-Forwarded-Forsemantics. No RFC. Ordering, duplicate field handling and trust are conventions.no_proxymatching. No specification of any kind. Every client implemented it independently, and they disagree, which is documented in the no_proxy environment variable and testable with the no_proxy tester.- PAC file semantics. The format originated as a Netscape document. Helper function behaviour, return string syntax support and error handling differ per browser. See PAC files and WPAD.
When there is no specification, "correct" means "matches the implementation you are actually running". That is why every page here version-qualifies its claims, and why the editorial standards require it.