HTTP头部的换行符风格

198
在HTTP标头中,哪种换行符样式更好:\r\n还是\n?为什么?
3个回答

283

\r\n是协议规范中定义的换行符号。RFC2616在2.2节开头非常明确地声明了"基本规则",:

CR = <US-ASCII CR, 回车符 (13)>
LF = <US-ASCII LF, 换行符 (10)>
HTTP/1.1将CR LF序列定义为除实体主体外所有协议元素的行尾标记。

RFC2616在技术上已被RFC7230取代,但它没有进行重大更改,并再次将CRLF作为分隔符在第3节中进行引用,并且该RFC参考RFC5234,附录B.1来定义"CRLF"为%x0D %x0A

然而,鉴于人们会为任何目的打破标准,因此在第19.3节中有一个"容错规定"(请注意,它重新强调了正确的序列):

“message-header fields”的行终止符是CRLF序列。但是,我们建议应用程序在解析此类标题时,将单个LF识别为行终止符并忽略前导CR。
在更新的RFC7230,§3.5中,
尽管start-line和header字段的行终止符是CRLF序列,但接收方可以将单个LF识别为行终止符并忽略任何前导CR。
因此,除非您想要成为邪恶的人或违反RFC的规则,请使用\r\n

14
很好的清晰回答。这正是StackOverflow最擅长的:对于简单明确的问题提供简单明确的答案,而不需要那些无用和无助的博客和文章。 - Miles Rout
2
@Pacerier:根本没有提到这样的事情;因为它基本上指定了“这是HTTP的唯一有效语法”,任何其他东西都是无效的语法。当然,你可以违反RFC,没有人能阻止你——但那时你技术上不再实现HTTP客户端,只是实现了某种看起来类似的东西;) - Piskvor left the building
1
个人认为,了解为什么选择\r\n而不是其他选项(\r\n或其他)会很有趣。 - Dan M.
2
@DanM:感谢微软! - palswim
2
RFC7230取代了RFC2616,其中第3.5节包含相同的文本。 - Grief
显示剩余7条评论

30

\r\n 是因为 RFC 2616 规定的(第2.2节,“基本规则”):

HTTP/1.1 定义了 CR LF 序列作为除实体主体之外的所有协议元素的行尾标记(参见附录19.3,用于宽容的应用程序)。实体主体内部的行尾标记由其关联的媒体类型定义,如第3.7节所述。

   CRLF           = CR LF

17

浏览器遵循RFC2616标准,因此使用CRLF ("\r\n")。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接