最近发现一个奇怪的问题,Chrome在Ajax请求某个cgi时失败,直接请求的话,返回正常。IE,FF下工作正常。

环境是前端是nginx做反向代理,请求后端Apache,Nginx开启了Gzip。

经过抓包发现:
1.  JS中使用HEAD方法请求了 www.eit.name/time.html来获取服务器时间
2.  Js异步加载 www.eit.name/cgi-bin/test/view来获取数据
3.  Nginx在处理time.html时,返回了 HTTP Header + Body(upstream返回的空Body 并进行gzip)
4.  Chrome在收到HTTP Header后,根据HTTP协议标准,认定HEAD请求后没有Body,所以直接在同一个HTTP连接里面,发起了/cgi-bin/test/view的请求
5.  Chrome将 time.html gzip body + view body做为view的body进行解析, 解析失败,所以请求view失败。
6.  IE,FF也是同样的请求逻辑,但在第5步时进行了容错处理,所以工作正常。

解决此问题的方法,需要针对HEAD方法特别配置:

if ( $request_method = HEAD ) {
    return 200;
}
Net | 评论(0) | 引用(0) | 阅读(7731)