Transfer-Encoding:chunked与nginx 0.6.34[转]

August 10th, 2010 by admin Leave a reply »

自从Labs主站换Nginx方式做分布以后,一直有一个困扰着我们的问题,就是页面无法访问和找不到的时候,显示的前后多了一些数字。因为之前一直没有时间去调查这个问题,所以就这么放着,最近终于找到机会研究了一把。

结论是php在输出Transfer-Encoding:chunked类型的内容时,nginx有时会在这个chunked的外面再套上一层 chunked的内容,而这个现象一般不会出现,只会在php里调用header()里有控制使用的http协议的内容时,也就是有 header(‘HTTP 1.1 xxx’)的时候,抓包就可以看到经过nginx之后的http header里有两个Transfer-Encoding:chunked,而内容里开头也有两个紧跟着的长度值。浏览器在处理完第一个长度之后,直接把 第二个长度显示出来了,也就造成用户直接看到了页面开头有几个数字。

经过网上调查,发现nginx目前的稳定版还不能解决Transfer-Encoding为chunked时的相关问题,而最新的0.7.30版还 在开发状态中,所以只好从php这边想办法。经过小付提醒,偶然发现在设置header(‘HTTP 1.0 xxx’)的情况下,php和nginx的反应都比较正常,浏览器上也没有看到显示出来长度,所以目前这个问题就这么解决了。

不过后来又抓了一下改变php代码之后的包,结果却又是令人吃惊,虽然程序里设置http协议为1.0,而实际抓到的包的内容却是这样的:

HTTP/1.1 403 Forbidden

Server: nginx/0.6.34

Date: Sun, 04 Jan 2009 03:49:50 GMT

Content-Type: text/html; charset=utf-8

Transfer-Encoding: chunked

Connection: keep-alive

Expires: Sun, 19 Nov 1978 05:00:00 GMT

Cache-Control: store, no-cache, must-revalidate

Pragma: no-cache

Last-Modified: Sun, 04 Jan 2009 03:49:50 GMT

Cache-Control: post-check=0, pre-check=0

Content-Encoding: gzip

a

……….

1924

.\ys.G..[D.;.

抓包显示nginx对客户端使用的还是HTTP 1.1协议,很奇怪,看看直接从apache上得到的数据如何:

HTTP/1.0 403 Forbidden

Date: Sun, 04 Jan 2009 04:17:54 GMT

Server: Apache/2.2.3 (CentOS)

Set-Cookie: ZDEDebuggerPresent=php,phtml,php3; path=/

Expires: Sun, 19 Nov 1978 05:00:00 GMT

Cache-Control: store, no-cache, must-revalidate

Pragma: no-cache

Last-Modified: Sun, 04 Jan 2009 04:17:54 GMT

Cache-Control: post-check=0, pre-check=0

Connection: close

Content-Type: text/html; charset=utf-8

看来nginx喜欢包办,还是自已转比较顺。

http://www.byreach.com/solr/search/nginx?q=node/326

Advertisement

Leave a Reply