HTTP Header 值允许的字符

HTTP Header value allowed characters

我已经检查了 RFC 中的 HTTP header 值允许字符。我无法理解整个事情,请描述更多。 RFC 参考 https://datatracker.ietf.org/doc/html/rfc7230#section-3.2

 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

阅读这些 RFC 中的 Augment BNF 语法需要一些时间来适应,但让我们逐步了解它:

field-value = *( field-content / obs-fold )

这表示一个值可以包含任意数量的 field-content 或任意数量的 obs-fold(续行 - 我们稍后会讲到)。

field-content 定义为:

field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]

这是一个 field-vchar,可以选择后跟一个或多个 space 或制表符,然后是 field-vchar.

接下来我会剧透并告诉你 field-vchar 基本上是任何可见的文本字符(即不包括 space、制表符、换行符或控制字符)。所以上面告诉你的是,它基本上是任何可见字符,但也可以包括 space 和制表符,但不能在开头或结尾。

field-vchar 定义为:

field-vchar = VCHAR / obs-text

这是一个 VCHAR(在 RFC 中进一步定义为“任何可见的 [USASCII] 字符”)或 obs-text(%x80-FF 范围内的字符 - 基本上是额外的可打印字符的基本 ASCII 字符)。

然后我们一直回到定义最后一项的第一个语句:obs-fold 我们得到:

obs-fold       = CRLF 1*( SP / HTAB )
                ; obsolete line folding
                ; see Section 3.2.4

基本上是一个换行符后跟一个或多个 space 或制表符。这是将 header 拆分为多行以提高可读性的历史方法(尽管换行符和白色 space 被有效地忽略并被视为 space 所以它不是换行符) .对此的支持总是有点古怪,许多 HTTP 处理器假设 headers 中不会有换行符(即使在技术上是允许的)。强烈建议不要使用它,特别是因为它现在已被正式弃用。 (请注意,某些服务器 - for example Apache - 允许在其配置中添加新行以提高可读性,但不发送这些新行,因此这是一个单独的项目)。

综上所述,字段值基本上可以包含任何可见字符,包括制表符或 spaces(但不能以这些字符开头或结尾)。它们不能包含换行符或任何其他 non-visible 字符(即 ASCII 字符 0-31 - 除了讨论的制表符 - 或 127)。