打印此内容时出现内部服务器错误:
这是我的代码(python):
print "HTTP/1.0 200 OK\n\r",
print "Content-Type: text/html\n\r",
print "\n\r",
错误日志说:
malformed header from script 'bad_req.py': Bad header: HTTP/1.0 200 OK
我研究了这个问题,找不到任何解决方案。任何帮助将非常感激。
是的,肯定是错误的行尾。
您应该有“\r\n”,但如果您使用脚本作为 CGI,您也不必担心这一点。
您只能使用“\n”,一切都会正常工作。
另外,我认为 Apache 不会让您选择要使用的协议,因此您不应该使用第一行:
print "HTTP/1.0 200 OK"
200 OK 是无论如何都会在成功时返回的状态
如果您确实需要更改状态,请使用 Status HTTP 标头,Apache 会适应它:
打印“状态:400 禁止”
您的脚本应如下所示:
# If you want status :D
print "Status: 200 Some nasty extra status"
print "Content-Type: text/html\n"
# End of headers
print "<h1>Some HTML here</h1>"
请注意,我仅在最后一个标题上使用了“\n”,而在其他任何地方都没有。
这是因为 print 会自动添加“\n”,除非你另有说明,但最后一个标题必须与文档正文分开,并用两个新行“\r\n\r\n”,这就是你应该使用它的原因仅在最后一个标题上。它表示标题的结束。
或者你可以这样做:
print "Content-Type: text/html"
print
没有参数的打印将只打印“\n”,正如我之前所说,Apache 会将它们正确解释为“\r\n”
在您的情况下,您的标题看起来像这样:
"""
HTTP/1.0 200 OK
\rContent-Type: text/html
\r
\r
"""
这显然是一个错误的标题。:D
如果您不使用脚本,因为 CGI 规则可能会有所不同,但只是略有不同。
如果您必须强制执行 HTTP/1.0 行为,请使用标头 Connection 标头:
print "Connection: close"
尽管连接是否会关闭仍然取决于客户端和 Apache 的超时。我不确定协议是否会更改为 HTTP 1.0。默认值为 1.1
您正在结束\n\r
. ( LF
+ CR
)。
根据HTTP1.0 页面(第 2.2 节):
HTTP/1.0 将八位字节序列定义
CR
LF
为除实体主体之外的所有协议元素的行尾标记(有关容错应用程序,请参见附录 B)。
所以你应该以\r\n
.