Apache2&#34;响应头名称&#39; <! - '包含无效字符,中止请求“

时间:2017-07-28 14:12:41

标签: python apache http cgi

修改

问题与http标头无关。它是在定义之前在cgi / python脚本中调用的变量。以防其他人也尝试使用这样的错误消息但无法找到原因。


我继承了一个基于apache2 / python / cgi脚本的网站,我试图维护它,但有时候我正在努力解决真正无用的错误。在这种情况下,我得到服务器遇到内部错误或配置错误,无法完成您的请求。点击页面上的元素。错误日志为我提供了以下信息:
[Fri Jul 28 14:11:15.150877 2017] [http:error] [pid 1727] [client 193.174.111.250:53426] AH02429:响应头名称'<! - '包含无效字符,中止请求

基于类似的问题,我假设错误是相当新的,但我找不到问题。特别是因为链接/脚本名称保持不变。它在第一次打开网站时有效,但是当我点击不引用我不同网站/脚本的内容时它会停止工作。怎么可能是标题的错?

以防万一,以下是生成网页开头的代码:

  Code =“Content-Type:text / html \ n \ n”
代码+ =“<!DOCTYPE HTML PUBLIC' -  // W3C // DTD HTML 4.0 Transitional // EN'> \ n  \ n”
代码+ =“ \ n  BACTOME:RELATIVE EXPRESSIONS  \ n”
...
 

据我所知,第一行构成了我唯一的HTTP头。错误日志中没有'<! - '。标题是否需要其他任何功能?

PS:或者,如果有任何简单的方法可以将这些通用错误转换为更冗长的错误,我也会对此非常感兴趣。

4 个答案:

答案 0 :(得分:1)

@eorochena和@dogacan的回答是特殊情况。一般来说:

如果Python CGI脚本中引发了异常,则会出现此错误。

找出问题所在的好方法是在CGI脚本的开头调用Python的CGI模块调试助手功能,如下所示:

cgitb.enable(display=0, logdir=OUTDIR)

其中OUTDIR是目录名称。如果您的CGI脚本引发某些异常,则Apache将HTML文件放入该目录。该文件具有一些垃圾名称,例如tmpw4olz3xr.html,并且文件末尾包含HTML注释(<!-- ... -->内的Python堆栈跟踪。这是可以帮助您解决问题的信息。

注意:

  1. display=0参数表示未显示错误详细信息 在浏览器中找到您的用户。
  2. 您可能应该注释掉 cgitb.enable(...),当您确定脚本可以正常运行时。

答案 1 :(得分:1)

目的

我认为使用cgitb的目的是从Web浏览器获取全部信息以帮助调试。因此,我们建议纠正问题,而不是避免出现问题。

做一些研究

让我们看一下这些信息:

AH02429: Response header name '<!--' contains invalid characters, aborting request

它指示标题名称包含无效字符,因此我对cgitb.py代码进行了如下研究:

    def reset():
    """Return a string that resets the CGI and browser to a known state."""
    return '''<!--: spam
Content-Type: text/html

<body bgcolor="#f0f0f8"><font color="#f0f0f8" size="-5"> -->
<body bgcolor="#f0f0f8"><font color="#f0f0f8" size="-5"> --> -->
</font> </font> </font> </script> </object> </blockquote> </pre>
</table> </table> </table> </table> </table> </font> </font> </font>'''

此函数返回字符<!--。但是apache httpd将其视为不应包含<!--的响应标头名称。 python的问题跟踪器中还有一个打开的issue8704

也许不是一个好的解决方案

我不知道我们应该删除cgitb.py中的代码还是调整apache httpd的配置。我的解决方案是删除一些代码,如下所示:

        return '''
<body bgcolor="#f0f0f8"><font color="#f0f0f8" size="-5"> -->
<body bgcolor="#f0f0f8"><font color="#f0f0f8" size="-5"> --> -->
</font> </font> </font> </script> </object> </blockquote> </pre>
</table> </table> </table> </table> </table> </font> </font> </font>'''

那它工作得很好,而且视野很好。任何人都知道ngix的情况吗?

答案 2 :(得分:0)

在我的情况下,问题是print语句输出的对齐方式

在:

try:
    if <some-condition>
        message = "%s" % filename
    else:
        message = "file not found"
    print """\n
        Content-Type: text/html\n
        <html><body>
        <p>%s</p>
        </body></html>
        """ % (message,)
except Exception as e:
    print e

后:

try:
    if <some-condition>:
        message = "%s" % filename
    else:
        message = "file not found"
    print """\
Content-Type: text/html\n
<html><body>
<p>%s</p>
</body></html>   
""" % (message,)
except Exception as e:
    print e

答案 3 :(得分:0)

对于同样的错误,在类似的打印案例中,这是由于数据库整理;把它换成UTF-8对我有帮助。