我正在尝试在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
。
是什么原因导致这种行为,我该怎么做才能使它起作用?
答案 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
某些服务器对标头的数量和标头行的长度有限制。您的错误日志可能可以提供更多有关此内容的信息。
要使它更有用,我们需要查看一些实际代码。演示该问题的简短程序可能会帮助您解决此问题。