Apache2“响应头名称'<!- -'包含无效字符,中止请求”

9

编辑

问题与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"
Code += "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>\n<html>\n"    
Code += "<head>\n  <title>BACTOME: RELATIVE EXPRESSIONS</title>\n"
...

据我现在的理解,第一行是我唯一拥有的HTTP头。错误日志中没有'<!--'。这个头需要其他什么东西才能正常工作吗?
PS:另外,如果有任何简单的方法可以将这些通用错误转换为更详细的错误,我也非常感兴趣。

但我仍然不知道如何解决这个问题或者在哪里找到答案... 这真的是一个很糟糕的问题吗?由于我在这个领域没有经验,我真的不知道。 - Lilith-Elina
如果您无法提供有助于回答问题的有用信息,那么这就是一个糟糕的问题。您能提供请求的HTTP头吗? - Arount
如果我因为响应头存在问题而收到此错误,那么这意味着在我收到500错误之前生成了不同的响应,对吗?有没有任何地方可以实际查看此响应?我本来想相应地编辑我的问题,但显然我无法创建新段落。 :-/ - Lilith-Elina
你可以使用 curl -I "http://www.urlofyourapp.com/foo/bar" - Arount
谢谢!它只给我错误响应,就像Chrome一样,但是我找不到任何带有“<!--”的响应头,就像error.log所说的那样。 - Lilith-Elina
显示剩余4条评论
4个回答

11

@eorochena和@dogacan提供的答案是特例,在一般情况下:

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

找出问题的好方法是在CGI脚本开头调用Python的CGI模块debug辅助函数,如下所示:

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

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

注意:

  1. 参数display=0表示不会在浏览器中显示错误详情给用户看。
  2. 当您确信脚本运行正常时,您应该将cgitb.enable(...)注释掉。

谢谢! 我“继承”的所有脚本都有自己的调试功能,但我一定会记住这个。 - Lilith-Elina
@Lilith-Elina 很高兴我能帮到你。如果你喜欢我的回答,能否请你点赞支持一下呢?毕竟我们都是靠市场生存的,你知道的... :-))) 祝好,Laryx - András Aszódi

3

目的

我认为使用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>'''

它运行得非常好,视图效果很好。有人知道nginx的情况吗?


0
在我的情况下,问题出在打印语句输出的对齐方式上。
之前的代码如下:
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

一开始?有趣!所有生成此网站的脚本中都缺少这个。我现在正在度假,但回到办公室后一定会看看。感谢您分享您的见解! :-) - Lilith-Elina
那绝对不是问题。在 Content-Type 之前添加换行符会导致只打印代码而不是显示网站。 - Lilith-Elina
你是正确的,问题在于打印语句中HTML文本的对齐方式,检查我的编辑答案。 - eorochena
好知道,谢谢!在我的脚本中,每行只有一行,所以不会出现意外的缩进,但知道这一点还是很好的。 - Lilith-Elina

0

对于相同的错误,在类似的打印情况下,这是由于数据库排序规则;将其更改为UTF-8有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接