RFC 6648: Deprecating the "X-" Prefix and Similar Constructs in Application Protocols

2026-05-24

RFC: RFC 6648

Published: June 2012

Authors: P. Saint-Andre, D. Crocker, M. Nottingham

Every engineer has typed X-Forwarded-For, X-Frame-Options, or X-Mailer without questioning the leading X-. That two-character convention is the subject of one of the IETF's most charmingly self-correcting Best Current Practice documents — a short RFC that essentially says "we were wrong for thirty years, please stop."

The original idea. Dave Crocker's RFC 822 (1982) introduced the X- prefix for email headers as a polite way to mark something experimental or private: anything starting with X- was guaranteed never to collide with a future standard header. The convention spread virally — into MIME content types (application/x-www-form-urlencoded), HTTP, SIP, vCard, LDAP, and beyond. It felt principled: a clear namespace boundary between "official" and "vendor."

The problem it created. Experimental things have an awkward habit of succeeding. X-Forwarded-For became ubiquitous. X-Archived-At shipped in millions of mailing-list messages. application/x-gzip was everywhere. When the IETF eventually wanted to standardize these, it faced a brutal choice:

Either way, you get the "two-name problem." Implementers must read both X-Foo and Foo; senders must guess which the recipient understands; specifications fill up with compatibility clauses. The X- prefix wasn't a namespace, it was a trap.

What RFC 6648 actually says. Three recommendations, in plain language:

The reasoning is subtle. A name should describe what the parameter does, not who blessed it. Standardization status is metadata that belongs in registries (IANA), not in the wire syntax. Once you internalize this, the X- prefix looks like committing your build number into every source file.

The lovely backstory. Dave Crocker, who authored the original RFC 822 convention in 1982, is a co-author of the RFC deprecating it thirty years later. Few standards bodies are willing to publish "the thing my younger self invented was a mistake, here's why" — fewer still get the original author to sign the death certificate. Mark Nottingham (HTTP working group chair) and Peter Saint-Andre (XMPP) brought the cross-protocol perspective.

Why it still matters. Walk through any modern HTTP response and you'll see the lesson half-learned: Content-Security-Policy, Strict-Transport-Security, and Permissions-Policy all shipped without the prefix — direct descendants of this RFC. Meanwhile X-Frame-Options, X-Content-Type-Options, and X-XSS-Protection remain as fossils, and the Forwarded / X-Forwarded-For coexistence is exactly the mess RFC 6648 predicted. If you're designing a header, query parameter, JSON field, or DNS TXT format today: pick a real name, register it if appropriate, and skip the prefix.

Why it matters: A "temporary" naming convention with no exit strategy will calcify into permanent technical debt — name things for what they do, not their standardization status.

All newsletters