2

打印此内容时出现内部服务器错误:

在此处输入图像描述

这是我的代码(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

我研究了这个问题,找不到任何解决方案。任何帮助将非常感激。

4

2 回答 2

2

是的,肯定是错误的行尾。

您应该有“\r\n”,但如果您使用脚本作为 CGI,您也不必担心这一点。

您只能使用“\n”,一切都会正常工作。

另外,我认为 Apache 不会让您选择要使用的协议,因此您不应该使用第一行:

print "HTTP/1.0 200 OK"
  1. 200 OK 是无论如何都会在成功时返回的状态

  2. 如果您确实需要更改状态,请使用 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

于 2015-11-24T23:09:26.733 回答
1

您正在结束\n\r. ( LF+ CR)。

根据HTTP1.0 页面(第 2.2 节):

HTTP/1.0 将八位字节序列定义CR LF为除实体主体之外的所有协议元素的行尾标记(有关容错应用程序,请参见附录 B)。

所以你应该以\r\n.

于 2015-11-24T22:45:07.297 回答