2016年2月25日星期四

一个诡异的HTTP错误

最近一个Django项目,在通过内部一个代理设备访问后,某个表单提交后,就出现了如下的错误:
Bad Request
Your browser sent a request that this server could not understand. Error code: 63
后续的访问也一直出错。通过浏览器调试工具,发现是400错误。把站点的cookie清了就好了。进一步看是一个叫message的cookie项引起的问题,只需删掉这个cookie就好了。

排除了服务后端的故障,然后通过Nginx作反向代理,并为出线上述错误。于是让我们的运维检查这台设备。

这是Array Networks的一个负载均衡设备。开始时候认为是cookie太长,后来发现并不是。这条cookie当我用curl请求时,把这条叫message的cookie内容改成普通字符后,错误消失了。对了,原来的内容是:
messages="835c9e7a8999c8d105885625317e3ffeda5cca89$[[\"__json_message\"\0540\05425\054\"The user \\\"tux\\\" was changed successfully. You may edit it again below.\"]]"
所以我把问题定位为这个设备的bug。

在这之前我都没听过这个公司,原来大家说的"Arrary"不是什么阵列,而是一个网络设备商的名字。考虑到用Google全文搜索开头的出错,只有两条结果且都在国内;考虑到Array Networks市场份额的43%在中国,我更加确定是这个设备的问题了。

根据StackOverflow上这个帖子,得知RFC 6265里面推荐了cookie的值只能是某些普通的ASCII字符,要填这个坑的话就需要去给Django提交建议了。

PS:这个问题解决过程,搜出了“复员军人不接受强拆就是网上通缉犯吗”的帖子,真是醉了……在这个帖子后面有这样的回帖:
昨天早晨,我点击凤凰网论坛、博客、微博,就跳出以下提示:
Bad Request
Your browser sent a request that this server could not understand. Error code: 63 Parser Error: [Cookie: ALLYESID4=0498B7D443AD806F; userid=1344328900625_6468; samemappingcookie=m; _plst[_plid_]=3072171655; py_map=1; vjuids=7d7548b9c.138233b91db.0.3f080ee819d02c; vjlast=1340620903.1345658526.11; ua_map=adchina; pgv_pvi=6917995520; pgv_si=s5491098624; Q37_cookietime=0; prov=cn0851; city=0851; weather_city=gz_gy; olyput=1344836990481%7C1345737966421; if_play_u=bjflGMzpVfSI9V9oT3waAJR4kF4; __gads=ID=fb631e879772a279=1344995081:S=ALNI_Mb4jCw0mDn_bkcI1AY8Mx1giTljlg; reborn=A%2BQLyQi6VeoFsFfOBeoFqlHK; sid=3B0D495188FDFE2858508FF9ECFC3322%E7%99%BD%E4%B9%9F%E8%AF%97; Q37_auth=1jFM%2Bm%2FG0coIROhfIQJMjrX7h2ZRfily6XYD; Q37_sid=iUIeZf; IfengArp_2725=1; IfengArp_2726=0; ifengRotator_ArpAdPro_2013=1; b_his="[{\"b]
我用360度急救后,才又能进入。我请求懂軟件的朋友看看,这提示是否表示我的电脑受到了来自贵州某地的木马攻击!
这位仁兄也遇到了和我一样的错误,不过他的出错信息更详细,给出的错误原因是cookie解析出错,这里显示的cookie也包含某些特殊字符,例如冒号。

PS2:一开始上面这个回帖,我说这哥们是迫害妄想症吧,一看他的ID正好是paranoia,逗坏我了: