寫在前面
最近在開發需求時,之前部署的一個項目,測試小姐姐說接口出了問題,然后查看日志發現是請求頭中包含的兩個命名含有下划線的參數沒有傳過去值,但是本地啟動項目測試,並沒有復現問題,但是測試環境下部署的項目就不行,多方查找,后來發現是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里不要用 “_” 下划線命名變量,可以使用駝峰方式進行命名。
