RFC 7230的field-value语法存疑?Chrome是否未遵循HTTP/1.1规范?
关于HTTP/1.1头字段值语法的误解与Chrome行为解析
首先你对RFC 7230定义的field-value语法理解有误,以下是正确的解析:
语法规则的正确解读
根据RFC 7230的ABNF语法:
field-value = *( field-content / obs-fold ) field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] field-vchar = VCHAR / obs-text
field-content的定义是:单个field-vchar,或者一个field-vchar后接一个或多个空格/制表符,再跟一个field-vchar。这意味着field-content既可以是单个非空白字符(比如a),也可以是带空格分隔的两个非空白字符(比如a b)。field-value是零或多个field-content或obs-fold的序列。这里的*表示重复,也就是说,你可以将a b c d拆分为多个合法的field-content(比如a、b、c、d,或者a b、c d等组合),因此这个字符串完全符合field-value的语法规范,不存在“不合法”的情况。你之前认为它不合法,是错误地限制了field-content的组合方式。
Chrome的User-Agent头合法性
你提到的Chrome请求头User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36中,Mac OS X 10部分完全符合语法:
Mac、OS、X、10都是合法的field-content(单个field-vchar序列),它们的拼接构成了合法的field-value。- 即使把
Mac OS看作一个field-content(Mac后接空格+OS),同样符合规则。
关于“怪异设计”的误解
你觉得设计怪异,本质是对ABNF语法的重复规则理解偏差。field-value的语法并没有禁止多个单字符field-content的连续,只是通过field-content的定义避免了以空白字符开头或结尾的字段值,同时允许字段值内部用空格分隔内容,这是符合HTTP头字段的实际使用场景的。
内容的提问来源于stack exchange,提问作者kjh6b6a68
相关产品推荐
相关产品推荐

