在我的服务器中发布基本 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"
200 OK 是一个无论如何都会返回成功的状态
如果确实需要更改状态,请使用 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
打印时出现内部服务器错误:
这是我的代码 (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"
200 OK 是一个无论如何都会返回成功的状态
如果确实需要更改状态,请使用 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