自定義HTTP HEADER的陷阱

如果自定義頭信息的關鍵字裏帶有 “_” ,比如 File_Last_modified: ,這樣的在服務器通過 request,getHeader('File_Last_modified') 是獲取不到的,只能這樣命名才行:File-Last-Modified

 

 

問題本身很好解決。然而我們想要知道,服務器爲何要對字段名中使用了下劃線的頭視而不見呢?並且,不管是 Apache 還是 Nginx,對於這樣的情況,都不約而同地採取了一樣的策略。

在 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 系統變量中名中的下劃線,這樣容易引起混淆。

在 nginx 服務器中,通過顯式地設置 underscores_in_headers on 可以開啓在字段名中使用下劃線。默認該選項是關閉的,所以在默認情況下,所有包含下劃線的字段名都會被丟棄。

在我們的開發機中的確也開啓了這個選項,爲啥還是不能拿到字段名中包含下劃線的 HEADER 呢?這是因爲我們訪問這臺開發機的時候,前面還有一層代理服務器,而這臺代理服務器沒有開啓相關選項,導致這種 HEADER 被代理服務器直接丟棄。因此也強烈建議不要在 HEADER 的 Field-Name 中使用下劃線。



作者:幸SrA福
鏈接:https://www.jianshu.com/p/2320f1ece1a2
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章