项目的Apache升级,从2.2.24升级到2.2.34。刚开始我以为没有什么特别多的改动,但是升级的过程中发现改动还是不少的。
升级完毕,把主要的功能跑一跑,发现了几个问题,这里要记录一下。
正确的HTTP换行
问题:一客户端向Server发送一个HTTP的请求,在请求验证之后,Server会作为客户端的反向代理,访问网内资源。但升级之后,这个HTTP请求就一直失败。
原因:这个客户端在自己拼HTTP的请求时,用 \n 作为每一个Header的换行。但是HTTP标准中明确要求要用 \r\n。之所以升级前没有问题,那是因为那是的Apache检查没有那么严格而已。
不要什么都Print到Header中
问题:要从某页面下载一个zip文件,这个文件是请求之后临时打包了若干个文件到tmp目录之后产生的。然后通过read file推送到浏览器去的。升级之前没有问题可以正常下载,升级之后竟然出现500的Internal Error。
寻找:寻找了半天原因,重写的read file的function,还是老样子。后来在httpd的log中找到了一条线索。
Response header name ' adding' contains invalid characters, aborting request. 搜索了一下发现也是因为升级之后的Apache对HTTP Header进行了严格的检测才导致的。那么这个Header是谁加进去的呢?找了半天没发现有什么代码加这个Header,后来在http_filter.c中把这个header的Value也打印出来看看。打印之后,原因就浮出水面了。
原因:原因很简单,当我们zip多个文件时,正好是在拼接HTTP Reponse Header的过程中,我们拼接很简单直接向stdout输出就可以。也正是因为这个,zip在一般模式下打包文件时会输出一些信息,这些信息就自然而然也被当作HTTP Header,而因为Header name包含了非法字符,导致这个reponse都被检测出错误,被apache扔掉了。
总结
从以上两个问题就可以看出来,其实根本和Apache升级没什么关系,还是写代码的人对很多东西都一知半解、能用就行。但是,标准就是标准,还是认认真真按照标准来比较好。