最近上線一個項目,利用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問題解決~