在CGI脚本中,我们在程序的顶部使用:
print "Content-type: text/html\n\n";
不使用\n
,它将无法执行。但是,在HTML正文中,我们不使用\n
,因为\n
没有任何意义,对于我们使用<br>
标记的新行。
为什么标题行中需要\n
?
答案 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";
两者都会起作用!