CasperJS经Squid代理发送POST请求返回HTTP 400错误求助
解决CasperJS POST请求触发Squid「double-CR」导致的HTTP 400错误
我之前也碰到过类似Squid搭配PhantomJS/CasperJS时的请求格式问题,这个「double-CR」错误本质是PhantomJS在构造POST请求时,可能额外插入了多余的回车换行符(CR),导致请求不符合HTTP规范,被Squid的严格校验拦截了。结合你的场景,给你几个可行的解决思路:
1. 手动编码POST请求体,避免自动序列化的坑
CasperJS默认的对象转表单数据可能会引入多余的空白字符,试试手动把参数转换成URL编码的字符串:
// 手动编码所有参数,避免自动序列化的格式问题 var postData = [ 'host=' + encodeURIComponent(hostID), 'func=newjob', 'apikey=' + encodeURIComponent(key), 'test=' + encodeURIComponent(testing) ].join('&'); this.open('https://'+host+'/test.php?test=new1', { method: 'post', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: postData });
手动编码能完全控制请求体的格式,避免CasperJS自动处理时插入多余的换行或空格。
2. 调整请求头,强制规范格式
给请求添加几个关键头,避免持久连接或格式兼容问题:
this.open('https://'+host+'/test.php?test=new1', { method: 'post', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Connection': 'close', // 关闭持久连接,避免连接复用的格式问题 'Accept-Encoding': 'identity' // 禁用压缩,减少格式解析歧义 }, data: { 'host':hostID, 'func':'newjob', 'apikey': key, 'test':testing } });
3. 启用调试模式,确认原始请求格式
启动CasperJS时加上调试参数,查看发送的原始请求内容,确认是不是真的有多余的CR:
casperjs your_script.js --web-security=false --debug=true
在输出里找类似POST /test.php?test=new1 HTTP/1.1的部分,重点检查请求头的结尾和请求体的开头,看是否出现了重复的\r\n。
4. 升级CasperJS/PhantomJS版本
老版本的PhantomJS(比如1.x分支)确实存在HTTP请求格式的bug,建议升级到PhantomJS 2.1.1或CasperJS 1.1.4这类稳定版本,很多这类格式问题在新版本里已经被修复。
内容的提问来源于stack exchange,提问作者Ross
相关产品推荐
相关产品推荐

