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

时间:2015-11-24 22:28:16

标签: python apache http server http-1.0

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

enter image description here

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

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

2 个答案:

答案 0 :(得分:1)

您要在\n\r中结束行。 (LF + CR)。

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

  

HTTP / 1.0将八位位组序列CR LF定义为除Entity-Body之外的所有协议元素的行尾标记(有关容忍应用程序,请参阅附录B)。

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

答案 1 :(得分:1)

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

你应该有" \ r \ n",但是,如果您将脚本用作CGI,则不必担心。

您只能使用" \ n"一切都会奏效。

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

print "HTTP/1.0 200 OK"
  1. 200 OK是一个状态,无论如何都将返回

  2. 如果确实需要更改状态,请使用Status HTTP标头,Apache将适应它:

    打印"状态:400禁止"

  3. 您的脚本应如下所示:

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

    请注意,我使用了&#34; \ n&#34;只在最后一个标题上,而不是其他地方。

    这是因为印刷品增加了&#34; \ n&#34;除非你另有说明,否则最后一个标题必须与两个新行&#34; \ r \ n \ r \ n \ n&#34;的文档正文分开,这就是为什么你应该只在最后一个标题上使用它。它表示标题的结尾。

    或者你可以这样做:

    print "Content-Type: text/html"
    print
    

    没有args的打印只会打印&#34; \ n&#34;而且,正如我之前所说,Apache将正确解释为&#34; \ r \ n&#34;

    在您的情况下,您的标题看起来像这个repr:

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