標籤:
之前針對這個也不是很關注,這個chunked在nginx上是預設開啟的,但是在apache上沒有,所以當切換伺服器的時候,同時遇到了這個問題,探索資料內容存在亂碼。
定位我就知道應該是http header的問題,但是具體是什麼也不是很清楚。
仔細查閱發現,這個chunked編碼。
http以trunked編碼方式傳輸的資料表示規則
一般HTTP通訊時會使用是Content-Length頭資訊性來指定小,但是有時候無法確定資訊大小,就要使用trunked編碼動態提供body內容的長度。
進行Chunked編碼傳輸的HTTP資料要在訊息頭部設定:
Transfer-Encoding: chunked
表示Content Body將用chunked編碼傳輸內容。
Chunked編碼一般使用若干個chunk串聯而成,最後由一個標明長度為0的chunk標示結束。
每個chunk分為頭部和本文兩部分,
頭部內容指定下一段本文的字元總數(非零開頭的十六進位的數字)和數量單位(一般不寫,表示位元組).
本文部分就是指定長度的實際內容,兩部分之間用斷行符號換行(CRLF)隔開。
在最後一個長度為0的chunk中的內容是稱為footer的內容,是一些附加的Header資訊(通常可以直接忽略)。具體的chunk編碼格式如下:
- chunked-body =*chunk
- "0" CRLF
- footer
- CRLF
- chunk = chunk-size[ chunk-ext ] CRLF
- chunk-data CRLF
- hex-no-zero = <HEX excluding "0">
- chunk-size = hex-no-zero*HEX
- chunk-ext = *( ";" chunk-ext-name[ "=" chunk-ext-value] )
- chunk-ext-name= token
- chunk-ext-val= token | quoted-string
- chunk-data = chunk-size(OCTET)
- footer = *entity-header
RFC文檔中的chunked解碼過程如下:
- length := 0
- read chunk-size, chunk-ext(if any) and CRLF
- while (chunk-size >0) {
- read chunk-data and CRLF
- append chunk-data to entity-body
- length := length + chunk-size
- read chunk-size and CRLF
- }
- read entity-header
- while (entity-header not empty){
- append entity-header to existing header fields
- read entity-header
- }
- Content-Length := length
- Remove "chunked" from Transfer-Encoding
nginx伺服器關閉chunked編碼方式:
chunked_transfer_encoding off;
參考連結:
http://www.6san.com/759/
http://www.sunnyu.com/?p=175
http 編碼chunked