在我的服务器中发布基本 HTTP/1.0 200 OK 响应时 Apache 内部服务器错误?绝对打印换行符

Apache Internal Server Error when posting basic HTTP/1.0 200 OK response in my server? Definitely printing newline

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

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

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

您将结束 \n\r 中的行。 (LF + CR).

根据HTTP1.0 page(第 2.2 节):

HTTP/1.0 defines the octet sequence CR LF as the end-of-line marker for all protocol elements except the Entity-Body (see Appendix B for tolerant applications).

所以你应该在 \r\n 结束你的行。

是的,肯定是行尾错误。

您应该有“\r\n”,而且,如果您将脚本用作 CGI,则不必担心。

您可以只使用“\n”,一切都会起作用。

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

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

  2. 如果确实需要更改状态,请使用 Status HTTP header,Apache 会适配它:

    打印"Status: 400 Forbidden"

您的脚本应如下所示:

# 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>"

请注意,我只在最后一个 header 上使用了“\n”,其他地方都没有。

那是因为打印会自动添加"\n",除非你另有说明,但最后的header必须与文档的body分开两行"\r\n\r\n",这就是为什么你应该只在最后一个 header 上使用它。它表示 headers 结束。

或者你可以这样做:

print "Content-Type: text/html"
print

不带参数的打印将只打印“\n”,正如我之前所说,Apache 会将它们正确解释为“\r\n”

在你的情况下,你的 headers 看起来像这样:

"""
HTTP/1.0 200 OK

\rContent-Type: text/html

\r
\r

"""

这显然是错误的header。 :D

如果您不使用脚本,因为 CGI 规则可能略有不同。

如果您必须强制执行 HTTP/1.0 行为,则使用 header 连接 header:

print "Connection: close"

尽管是否关闭连接取决于客户端和Apache 的超时时间。我不确定协议是否会更改为 HTTP 1.0。默认为 1.1