Custom HTTP headers : naming conventions

Custom HTTP headers : naming conventions

技术背景

在HTTP协议中,开发者经常需要使用自定义HTTP头来传递额外的信息。早期推荐自定义HTTP头的名称以“X-”开头,例如X-Forwarded-ForX-Requested-WithRFC 2047 的第5节也提到了这一点。

实现步骤

旧的命名推荐改变

  • 2011年6月:第一个 IETF草案 发布,建议弃用使用“X-”前缀来命名非标准头。原因是当以“X-”为前缀的非标准头变为标准头时,去掉“X-”前缀会破坏向后兼容性,迫使应用协议同时支持这两个名称(例如,x-gzipgzip 现在是等效的)。所以,官方建议合理命名,不使用“X-”前缀。
  • 2012年6月:弃用使用“X-”前缀的推荐正式成为 RFC 6648。具体相关建议如下:
    • 新参数创建者的建议:不应在参数名称前加上“X-”或类似结构。
    • 协议设计者的建议:不应禁止注册带有“X-”前缀或类似结构的参数;不得规定带有“X-”前缀或类似结构的参数应被理解为非标准化的;不得规定没有“X-”前缀或类似结构的参数应被理解为标准化的。

不同使用场景下的命名

全局适用特性场景

对于开发者引入像 “Forwarded-For” 这类新的全局适用特性,按照 IETF 建议,不使用“X-”前缀并合理命名。

应用特定数据传递场景

对于应用开发者在客户端和服务器之间传递特定于应用的字符串,“X-”前缀仍有其合理性。使用该前缀可表明是自定义头,还能避免与少数官方保留的头名称产生命名冲突。同时,进一步使用如“X-ACME-ClientDataFoo”(假设公司名为 “ACME”)这样的前缀,能更好地进行命名空间分组。例如,直到2014年11月02日,Google仍使用“X-Mod-Pagespeed”来表示其Apache模块的版本。

HTTP头格式要求

HTTP 1.1 RFC 2616 规范定义了HTTP头的格式:

1
2
3
4
5
6
message-header = field-name ":" [ field-value ]
field-name = token
field-value = *( field-content | LWS )
field-content = <the OCTETs making up the field-value
and consisting of either *TEXT or combinations
of token, separators, and quoted-string>
  • 头名称:必须由ASCII字符的子集组成,包括字母数字和一些标点符号。
  • 头值:没有限制为 ASCII 或排除 8 位字符,明确由八位字节组成,仅禁止控制字符。注释暗示八位字节应被解释为 ISO - 8859 - 1 编码,超出该编码的字符可使用 RFC 2047 规则进行编码。不过实际使用中,为保证兼容性,建议使用 ASCII。

核心代码

最佳实践

  • 若自定义HTTP头有成为标准的可能性,遵循IETF建议,不使用“X-”前缀,合理命名。
  • 若为特定应用的私有API,使用“X-”前缀(或“X-公司名称-”)进行命名空间分组。
  • 对于HTTP头的值,尽量使用ASCII字符,以确保在所有服务器、代理和客户端上的兼容性。

常见问题

“X-”前缀已被弃用为何还可使用?

虽然官方推荐不使用,但“X-”前缀有助于明确这是自定义头,且对于不太可能成为标准的自定义HTTP头,使用该前缀能避免与官方保留头名称冲突,在特定应用的私有API中仍可合理使用。

HTTP头值超出ISO - 8859 - 1编码怎么办?

可根据 RFC 2047 规则对超出 ISO - 8859 - 1 编码的字符进行编码。不过,为保证兼容性,建议在实际开发中使用 ASCII 字符。


Custom HTTP headers : naming conventions
https://119291.xyz/posts/custom-http-headers-naming-conventions/
作者
ww
发布于
2025年5月30日
许可协议