自定義的請求頭,你去哪裡了?

黑馬大前端發表於2018-09-11

本文篇幅雖簡短,但卻是我本週最大的收穫,也希望能幫到看到本文的同學,少踩一個坑。


自定義的請求頭,你去哪裡了?


NodeJS常見的部署方式是通過NGINX作為負載均衡的代理轉發。


前端自定義了一個請求頭user_id來標識每一個使用者的請求,除錯的時候通過ip+port的方式訪問萬事大吉,當配置了nginx作為代理轉發後,一切開始變得不美好了。在Node層拿不到使用者的唯一標識user_id了。


我一開始以為是Node函式呼叫的問題,沒有正確地拿到請求頭,

再度懷疑是nginx沒有將請求頭代理傳給到Node服務。


那麼,我自定義的請求頭到底跑到哪裡去了?

不走nginx代理是OK的,那麼顯然不能歸咎於Node。


到底是誰製造了這一起失蹤案呢?

我再一次陷入了沉思。。。

.

.

.

.

.

.

.

.

.

.

.

.

.

.

突然,智慧之神降臨了,Google先知告訴我,NGINX自己把請求頭藏起來了。


原來nginx代理預設會把header中引數的 "_" 下劃線去掉,所以後端Node服務就獲取不到帶"_"線的引數名。


元芳,你怎麼看呢?

真相就在這裡,客戶請求的引數user_id包含了"_",nginx代理會預設忽略。

真的是無巧不成書,一腳踏入了這個坑中。

如果將自定義的請求頭user_id改成userId,那就不會掉進這個坑。


如果非要使用自定義請求頭user_id怎麼辦呢?


修改nginx中http的配置即可,underscores_in_headers由off設定為on。

underscores_in_headers on; 
#該屬性預設為off,表示如果header name中包含下劃線,則忽略掉。複製程式碼


Syntax:underscores_in_headers on | off;
Default:
underscores_in_headers off;複製程式碼
Context:http, server

Enables or disables the use of underscores in client request header fields. When the use of underscores is disabled, request header fields whose names contain underscores are marked as invalid and become subject to the ignore_invalid_headers directive.


NGINX文件參見:http://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers


本文作者: 黑馬大前端 cuitianze


相關文章