间歇性问题:POST请求已损坏

时间:2011-03-14 11:08:35

标签: php actionscript-3 post upload apache2

过去几个月我一直在经历一个奇怪的间歇性问题,我一直在疯狂地试图孤立。

我在我的网站上运行了一个Flash电影,它生成XML数据,然后通过POST请求将其发送到PHP脚本。这个文件的完整性是我的应用程序运行的关键,所以我需要确保它的到来。为此,我生成一个MD5哈希并发送它。在接收方,我的PHP脚本将接受数据,MD5它并比较两个哈希值。如果它们是相同的,那么我认为该文件很好并存储它供以后使用。如果MD5哈希值不同,我会给自己发一封电子邮件并复制该文件以供人工检查。

大多数时候(> 99%)这种方式都很漂亮,我发现上传的数据没有问题。但是,每隔一段时间我就会发现一些额外的字符被注入到XML文件中,导致它被破坏。发生这种情况时,文件似乎也会被截断。这是我在损坏的文件中看到的片段 - 看起来好像是一些与Web服务器相关的设置:

...开始XML数据......

     <scale>1.7</scale>
     <rotation>0</rotation>
     <popdelay>0.7290036325342953</popdelay>
    Proxy-Connection: keep-alive
Cache-Control: max-age=0

0<poptime>0.6</poptime>
     <popangle>90</popangle>
     <shadowvis>true</shadowvis>
     <backingcolor>0xFF222222</backingcolor>

...继续XML数据......

我发现问题会在特定计算机上发生后继续发生 - 即如果用户不断尝试上传其文件,则错误将继续在100%的时间内突然出现。我见过这种情况发生在多个浏览器/平台上(如下所列):

Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CMNTDF; InfoPath.3; .NET4.0C)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1)
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 (.NET CLR 3.5.30729)
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CMNTDF; InfoPath.3; .NET4.0C)

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3

我的应用程序服务器是通过另一个运行mod_proxy的apache2服务器访问的,虽然我不确定它是否正在扮演一个角色,因为这个程序似乎几乎一直在其他机器上运行。我试图调整我的apache2设置,但它们似乎没有任何区别(如果您认为它相关/有帮助,我可以稍后发布它们)

如果有人知道发生了什么或如何开始解决这个问题,我真的非常感激。我一直试图研究这个问题几个月,但没有想出任何东西。

非常感谢您的时间!

1 个答案:

答案 0 :(得分:0)

看起来您的代理服务器正在分组上传,因为客户端没有发送Content-Length标头。 http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#request-bodies

尝试启用proxy-sendcl,这会强制代理缓冲上传以确定内容长度,并在上传到服务器时停止上传。