1. 程式人生 > 其它 >Http請求頭中設定引數帶有下劃線傳輸獲取不到值問題解決

Http請求頭中設定引數帶有下劃線傳輸獲取不到值問題解決

寫在前面

  最近在開發需求時,之前部署的一個專案,測試小姐姐說接口出了問題,然後檢視日誌發現是請求頭中包含的兩個命名含有下劃線的引數沒有傳過去值,但是本地啟動專案測試,並沒有復現問題,但是測試環境下部署的專案就不行,多方查詢,後來發現是nginx配置的問題,但是nginx配置沒有許可權修改,無奈只能更改了命名方式,最後問題得以解決。所以鑑於此,記錄一下。

1、產生原因

為什麼伺服器會對下劃線視而不見呢?後來查閱相關資料,發現如下說法:

在 RFC 2616 4.2 節中,有這樣一段話:

Request (section 5) and Response (section 6) messages use the generic message format of RFC 822 [9] for
transferring entities (the payload of the message).

大致意思說的是:HTTP/1.1的請求和響應訊息使用 RFC 822 中的通用訊息格式來傳輸實體(訊息載荷)。

在 RFC 822 3.1.2節中,對於訊息格式的說明,有這樣一句話:

The field-name must be composed of printable ASCII characters (i.e., characters that  have  values  between  33.  and  126., decimal, except colon).

也就是說,HEADER 欄位名可以可由可列印的 ASCII 字元組成(也就是十進位制值在 33 和 126 之間的字元,不含冒號)。不含冒號很容易理解,因為 Field-Name和Value之間需要用冒號分割。然而,我們通過查詢 ASCII 碼錶可知,下劃線的十進位制 ASCII 值為 95,也在此範圍之內!

這樣也就是說,在 HEADER欄位名中使用下劃線其實是合法的、符合 HTTP 標準的。伺服器之所以要預設禁止使用是因為 CGI 歷史遺留問題。下劃線和中劃線都為會被對映為 CGI 系統變數名中的下劃線,這樣容易引起混淆。

2、問題解決

解決方案開始的時候也說了,可以通過修改nginx配置,也可以通過修改引數命名方式,避免使用下劃線或者中劃線命名變數。

1> nginx配置方案:

在nginx裡的 nginx.conf檔案中配置http的部分新增:

underscores_in_headers on

此配置可以開啟在欄位名中使用下劃線。預設該選項是關閉的,所以在預設情況下,所有包含下劃線的欄位名都會被丟棄。因此強烈建議不要在 HEADER 的 Field-Name 中使用下劃線。

2>在header裡不要用 “_” 下劃線命名變數,可以使用駝峰方式進行命名。

參考文件:https://www.lovecto.cn/20190621/610.html