为什么在打印标题时在CGI脚本中使用`\ n`?

时间:2016-07-22 05:27:30

标签: perl http cgi

在CGI脚本中,我们在程序的顶部使用:

print "Content-type: text/html\n\n";

不使用\n,它将无法执行。但是,在HTML正文中,我们不使用\n,因为\n没有任何意义,对于我们使用<br>标记的新行。

为什么标题行中需要\n

4 个答案:

答案 0 :(得分:3)

Content-type: text/html是HTTP标头,而不是HTML。对于检测HTTP头的结尾必须是一个空行。第一个\n表示当前行的结尾,第二个\n表示新的空行。

答案 1 :(得分:2)

CGI脚本的第一行必须是Content-Type: text/html,而print语句必须有2个\n个字符:

  • 一个终止当前行。
  • 第二个在CGI标题和数据之间产生需要空白行。

    print "Content-Type: text/html\n\n";

答案 2 :(得分:1)

任何HTTP响应(无论内容是否为HTML)都必须以状态代码(通常由Web服务器而不是CGI程序添加),Content-Type标头以及可选的一个或多个开头额外的标题。每个标题必须位于单独的行上(即以\n结尾)。发送完所有标题后,会使用一个空行来表示标题已完成,并且响应正文如下。

标题完成后,然后 HTML(或其他)正文开始,\n不再具有任何实际意义,因为HTML在呈现内容时会忽略它。

答案 3 :(得分:0)

注意:“CRLF”等价于“\r\n”(即一个 carriage return 后跟一个 line feed newline

对于每条 HTTP 消息,Header fields 后面必须跟一个 CRLF,然后是另一个 CRLF,as specified in RFC 2616

所以,你可能会问,如果在 HTTP 头之后需要两个 CRLF,我们为什么不直接用如下代码编写 CGI 脚本:

print "Content-type: text/html\r\n\r\n";

我们完全可以,这样的代码会运行得很好!然而,由于像 Linux 和 macOS 这样的基于 Unix 的系统使用 LF 作为换行符而不是 CRLF,因此 CGI 服务器被定制为与 Unix 环境配合良好,并通过将标头中的每个 \n 转换为 \r\n {1}},如 RFC 3875 中所指定。

利用当 CGI 脚本运行并将 CGI 标头转换为 HTTP 标头时服务器上发生的 LF -> CRLF 转换,我们可以运行:

print "Content-type: text/html\n\n";

并且只要我们的 CGI 服务器的行为符合 RFC 规范,这两个 LF 字符就会在发送 HTTP 消息时呈现为两个 CRLF。

考虑到 LF -> CRLF 替换的这一原则,我们可以尝试其他可能性,例如让 CGI 服务器仅将第一个 LF 替换为 CRLF:

print "Content-type: text/html\n\r\n";

或者只是第二个LF:

print "Content-type: text/html\r\n\n";

两者都会起作用!