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

Perl 为什么在打印标题时在CGI脚本中使用“\n”?,perl,http,cgi,Perl,Http,Cgi,在CGI脚本中,我们在程序顶部使用: print "Content-type: text/html\n\n"; 如果不使用\n,它将不会执行。但是,在HTML正文中,我们不使用\n,因为\n没有任何意义,对于新行,我们使用标记 为什么标题行中需要\n?CGI脚本的第一行必须是内容类型:text/html,并且打印语句必须有2个\n字符: 一个用于终止当前行 第二个是在CGI头和数据之间生成require空行 print“内容类型:text/html\n\n” 内容类型:text/html是H

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

print "Content-type: text/html\n\n";
如果不使用
\n
,它将不会执行。但是,在HTML正文中,我们不使用
\n
,因为
\n
没有任何意义,对于新行,我们使用

标记


为什么标题行中需要
\n

CGI脚本的第一行必须是
内容类型:text/html
,并且打印语句必须有2个
\n
字符:

  • 一个用于终止当前行
  • 第二个是在CGI头和数据之间生成require空行

    print“内容类型:text/html\n\n”


内容类型:text/html
是HTTP头,而不是html。用于检测HTTP头的结尾必须是一个空行。第一个
\n
表示当前行的结尾,第二个
\n
表示新的空行。

任何HTTP响应(无论内容是否为HTML)都必须以状态代码(通常由web服务器而不是CGI程序添加)、内容类型标头和可选的一个或多个附加标头开头。每个标题必须位于单独的行上(即,以
\n
结尾)。发送完所有标题后,将使用一个空行指示标题已完成,响应正文如下

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

注意:“CRLF”相当于“\r\n”(即a后跟a)

对于每个HTTP消息,都必须在后面跟一个CRLF,然后是另一个CRLF

因此,您可能会问,如果HTTP头之后需要两个CRLF,为什么我们不编写CGI脚本,代码如下:

print "Content-type: text/html\r\n\r\n";
我们完全可以,这样的代码运行得很好!但是,由于基于Unix的系统(如Linux和macOS)使用LF作为换行符,而不是CRLF,因此CGI服务器被定制为在Unix环境中运行良好,并通过将标头中的每个
\n
转换为
\r\n
,如中所述

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

print "Content-type: text/html\n\n";
只要我们的CGI服务器按照RFC规范运行,那么在发送HTTP消息时,这两个LF字符将被呈现为两个CRLF

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

print "Content-type: text/html\n\r\n";
或者只是第二个LF:

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

这两者都可以工作!

这与Perl无关,与之无关,所有框架都有一种合理的方法来创建头,而不必键入所有这些,甚至CGI
$q->header;
实际上,它是一个CGI头。服务器接收CGI响应并将其转换为HTTP响应。这包括translate将裸换行符插入回车符-HTTP.HTTP所需的换行符对与CRLF分隔头行。大多数CGI程序输出的CGI头是供服务器使用的,以便将其损坏并扩展为正确的形式。