在Perl中打印多个HTTP标头

时间:2019-04-05 18:50:28

标签: perl http

我正在尝试在Debian的Apache2下运行基于TetraBB的遗留Perl Web应用程序。

此应用程序使用print输出HTTP标头,例如print "Content-type: text/html\n";

但是,似乎在第一个print之后,不再接受其他标头。在此示例中: print "A\n"; print "B\n"; print "\n";,标头A被浏览器识别为响应标头,而B则位于响应HTML的顶部。

撰写print "A\nB\n\n";即可。

此外,如果第一个print不包含\n\n,则会生成一个500 Internal Server Error

是什么原因导致这种行为,我该怎么做才能使它起作用?

2 个答案:

答案 0 :(得分:3)

两者之间没有区别

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

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

除非您更改了专门使它们与众不同的内容(例如$\)。实际上,如果尚未为STDOUT启用自动刷新,则输出将累积在缓冲区中,并以4或8 KiB块的形式发送到管道。这意味着管道的另一端也绝对没有可检测的差异。

答案 1 :(得分:1)

您实际上正在输出CGI headers,然后服务器将其转换为带有正确行尾的响应标头。 CGI标头在第一个双换行符之后停止。在准备好终止标题之前不要打印两个连续的换行符,并在需要结束标题时打印它们:

print <<HEADERS;
Content-type: text/plain
X-Some-Other: header

This is the body
HEADERS

某些服务器对标头的数量和标头行的长度有限制。您的错误日志可能可以提供更多有关此内容的信息。

要使它更有用,我们需要查看一些实际代码。演示该问题的简短程序可能会帮助您解决此问题。