我已经检查了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-content
或obs-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)。