最近由于支付宝当面付30天试用期已过,个人用户无法通过审核,不得已放弃了支付宝的当面付,转而使用第三方免签约的平台云免签。在给VerySource部署过程中卡在了回调状态更新这里。按平台说明,平台请求我的回调地址,我只要返回success字串,平台即认为回调成功,我按照要求写的回调程序,可是怎么调试平台后台始终显示回调失败。于是我检查了云免签的回调日志,发现他们收到的不是我返回的success字符串,而是一串乱码。我马上意识到,这是我程序输出压缩后的内容。看来云平台没有进行压缩的判断,直接获取了输出内容,但是我无法要求他们改他们的程序,只能从修改我的回调程序。
上网查了下nginx的gzip下有个gzip_min_length,意思是只要输出内容长度小于这个数,就不压缩了,于是修改了nginx配置,在原有gzip选项后面,加了一行如下:
gzip_min_length 1k;
心想我的输出一共就7个字符,肯定不会被压缩了,重启nginx后马上测试了一下,发现居然没起作用。这就奇怪了,于是又上网找了一大圈,国内的都是互相抄来抄去的,没什么有价值的内容。最后还是在英文网站上找到了答案:gzip_min_length 要和 http header Content-Length配合使用才会生效,即nginx只有知道Content-Length长度后,才能将这个值用于gzip_min_length选项。于是在我的回调程序开始增加一行最终解决了这个问题,部分代码如下:
header(‘Content-Length: 7’);
echo(‘success’);
总结:
1、如果云平台请求回调程序足够强大的话,应该增加一个判断是否压缩功能,从而准确获得各种可能环境下的返回值;
2、nginx开启gzip确实能有效降低带宽占用,但如果遇到和我类似的情况,对某个页面不希望开启gzip,可以按我上面说的来操作。
本文为原创文章,转载请注明出处!