关于RFC7230中HTTP Header value允许字符规则的解读问询
HTTP头部字段值ABNF规则解读
field-value = *( field-content / obs-fold ) field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] field-vchar = VCHAR / obs-text obs-fold = CRLF 1*( SP / HTAB ) ; obsolete line folding ; see Section 3.2.4
前置ABNF符号说明
*:表示前置元素可出现0次或多次/:表示左右元素二选一[]:包裹的内容为可选元素,可出现0次或1次1*():表示括号内元素至少出现1次SP:空格符(ASCII 0x20)HTAB:水平制表符(ASCII 0x09)CRLF:回车换行符(\r\n,HTTP协议的标准换行符)
逐规则解读
field-value(头部字段值整体)
规则定义头部值由0个或多个「合法字段内容」或「过时行折叠符」组成,用于兼容旧版协议的折叠格式。
field-content(合法字段内容)
合法内容的结构为:开头必须是1个合法的字段可见字符,后续可选择性添加「至少1个空格/制表符 + 1个合法字段可见字符」的组合。
通俗来说:空格和制表符只能出现在两个可见字符中间,不允许出现在内容的首尾,连续空白会被视为两个可见字符之间的分隔,具体是否保留要看解析实现。
field-vchar(合法字段可见字符)
允许两类字符:
- VCHAR:标准ASCII可打印字符,编码范围为0x21~0x7E,包含数字、大小写英文字母、常用标点符号
- obs-text:兼容旧实现的扩展字符,编码范围为0x80~0xFF,属于非ASCII的高位字符,新版协议不推荐主动使用
obs-fold(过时行折叠规则)
这是已经废弃的旧协议特性,早年允许将过长的头部值折为多行,换行后行首添加至少1个空格或制表符,接收端解析时会把折叠的多行内容拼接为完整的字段值。目前新版HTTP实现禁止主动发送该格式的内容,仅接收端会保留兼容解析能力。
开发注意事项
- 不要主动在头部值中使用0x80~0xFF的高位非ASCII字符,如需传递非ASCII内容,应先做百分号编码或Base64编码
- 不要使用过时的行折叠格式,过长的头部值直接放在同一行即可
- 不要在头部值首尾添加空格或制表符,避免不同实现的解析差异导致异常
内容的提问来源于stack exchange,提问作者Salman
相关产品推荐
相关产品推荐

