1. 程式人生 > >由ngx.say和ngx.print差異引發的血案

由ngx.say和ngx.print差異引發的血案

Jan 16, 2018openresty點選

最近上線一個專案,利用openresty在前面做反向代理,部分地址通過lua的http請求後端介面進行返回,線上下測試都沒問題,公司預發灰度測試都通過了,但是上線到微信站,就莫名其妙的報錯了。

通過手機抓包,我們發現傳送到手機的響應body沒有問題!!!那麼問題來了,為什麼明明能接收到響應體,但是微信瀏覽器就是報錯呢?

線下我們直接通過手機訪問是沒問題的,一上線為什麼就有問題了?

其中的問題就在於,我在openresty傳送到後端資料介面拿資料之後,是通過 ngx.say 方法響應到前面去的,ngx.say方法會預設增加一個換行,所以導致了後端資料介面返回的 Content-Length 長度不對了。

我們的微信站的域名是走的騰訊的CDN服務,騰訊CDN的nsws伺服器沒有完全遵守http協議,沒有隻讀取Content-Length的響應體,它對響應的body體和頭裡的Content-Length進行了匹配,發現不對,然後就響應了564的狀態碼,所以就導致了出錯的情況。

後來將ngx.say修改為ngx.print問題解決~