場景:
Nginx反向代理請求內網web服務(IIS),使用的是http1.0協議,使用內網訪問web服務器使用的是http1.1協議,web服務器上有coolite.net0.8(兼容http1.0)和ext.net2.0(可能不兼容http1.0,僅限http1.1)兩種類型的頁面。
表現:
1.使用內網(http1.1協議)能夠正常訪問coolite.net和ext.net頁面。
2.使用代理只能訪問coolite.net頁面,ext.net頁面報錯。
3.不使用代理,web服務器單獨部署,開放外網IP,從外網IP訪問coolite.net和ext.net頁面都正常。
報錯信息:
假設:
coolite.net很早開發,相關的組件和模塊的事件模型是基於http1.0的,ext.net最新版本的事件模型是基於http1.1的,全部經過nginx反向代理訪問致使ext.net頁面的事件模型解析錯誤而致使異常發生。
參考:
1.http1.0和http1.1差別:
2.ext.net bad respone error
驗證:
如今須要論證ext.net2.0使用http1.0致使事件模型解析出錯這結論,須要設計一個測試步驟以下:
1.編寫一個ext.net2.0頁面
2.本地模擬使用http1.0協議訪問該頁面,並觀察結果
結果:
不是http1.0致使,問題在於post和get的區別,經過ext.net2.0的源碼分析看出。nginx處理http post請求時,因爲ext.net頭部會加上
x-ext.net:delta=true;用於代表請求是異步請求,不然將看成get處理。
而nginx對
"."不識別,因此致使反向代理到web服務的轉發會把x-ext.net:delta=true給過濾掉。
解決方案:
鍵 值
x-ext.net:delta=true
源碼改成:
X-Ext.Net->X-Ext-Net
ext.net post頭部:
ext.net get頭部:
ext.net源碼分析:
Coolite GET請求頭部:
Coolite POST請求頭部: