最近遇到一個 Nginx 轉發的坑,一個請求轉發到 Tomcat 時發現有幾個 http header 始侄訓取不到,導致線上出現 bug,運維說不是他的問題,這個鍋我背了,
新增的幾個 header 是這樣的:
- accept_sign
- accept_token
- ...
反復檢查代碼,確定這些 header 是傳了的,而且本地測驗單獨在 tomcat 中是可以接受到這些引數的,所以 tomcat 和命名本身是沒問題的,初步斷定是 Nginx 的問題,
經過一翻搜索,終于找到了一個 Nginx 的配置引數:underscores_in_headers,這個引數默認值為:off,即默認忽略帶下劃線的 header,
解決方案:
1、在 http 或者 server 配置中把 underscores_in_headers 配置引數開關打開:
server {
...
underscores_in_headers on;
...
}
增加配置后,然后重啟 Nginx,
2、使用破折號(-)代替下劃線(_),或者統一規范直接不要使用下劃線;
我們來看下一般的 http header 長什么樣的:

一般所見的 headers 確實也都是中杠線,沒有下劃線,
Nginx 為什么默認忽略帶下劃線 header?
我找到了 Nginx 的官方說明:
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/?highlight=underscores#missing-disappearing-http-headers
If you do not explicitly set
underscores_in_headers on;, NGINX will silently drop HTTP headers with underscores (which are perfectly valid according to the HTTP standard). This is done in order to prevent ambiguities when mapping headers to CGI variables as both dashes and underscores are mapped to underscores during that process.
根據官方說明,這樣做是為了避免把 headers 映射為 CGI 變數時出現歧義,因為破折號和下劃線都會被映射為下劃線,所以兩者不好區分……
好吧,終于弄清楚了,這個問題也太變態了,這應該是 Nginx 設計時的一個缺陷吧,這個坑我替你們踩了!
所以,推薦大家使用第二種方案吧,統一規范 headers 不要使用下劃線,使用 Nginx 默認的配置即可,這樣可以盡量避免環境上的差異,以免后續帶來問題,
@阿里Java開發手冊 是否考慮新增這條規范?
著作權申明:本文系公眾號 "Java技術堆疊" 原創,原創實屬不易,轉載、參考本文內容請注明出處,禁止抄襲、洗稿,請自重,尊重他人勞動成果和知識產權,
近期熱文推薦:
1.Java 15 正式發布, 14 個新特性,重繪你的認知!!
2.終于靠開源專案弄到 IntelliJ IDEA 激活碼了,真香!
3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看,,
4.吊打 Tomcat ,Undertow 性能很炸!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/232268.html
標籤:Java
