HTTP头值允许的字符



我已经检查了HTTP头值允许字符的RFC。整个事情我无法理解,请再详细描述一下好吗?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-contentobs-fold(一个延续行-我们将得到它)。

field-content定义为:

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

这是一个field-vchar,后跟一个或多个空格或制表符,然后是field-vchar

field-vchar基本上是任何可见的文本字符(即不包括空格、制表符、新行或控制字符)。所以上面告诉你的是,它基本上是任何可见的字符,但也可以包括空格和制表符,但不能在开头或结尾。

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

基本上是一个换行符后面跟着一个或多个空格或制表符。这是为了可读性而将标题拆分为多行的历史方法(尽管换行符和空格被有效地忽略并视为空格,因此它不是换行符)。对这一点的支持总是有点不可靠,许多HTTP处理器认为头中不会有换行符(即使在技术上是允许的)。强烈建议不要使用这种方法,尤其是现在它已经被正式弃用了。(请注意,有些服务器——例如Apache——允许在配置中添加新的行以提高可读性,但不发送这些,所以这是一个单独的项目)。

将所有这些结合在一起,字段值基本上可以包含任何可见字符,包括制表符或空格(但不能以这些开头或结尾)。它们不能包含换行符或任何其他不可见字符(即ASCII字符0-31 -除了讨论的制表符-或127)。

最新更新