解決通過Nginx轉發的服務header中含有下劃線的key,其值取不到的問題
阿新 • • 發佈:2019-01-09
1. 問題
由於在http請求頭的頭部中設定了一些自定義欄位,剛好這些欄位中含有下劃線,比如bundle_name這種,後端在進去獲取頭部資訊時,發現取不到對應的值
2. 原因及解決辦法
分析
首先看一段nginx原始碼
ngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b,ngx_uint_t allow_underscores) if (ch == '_') { if (allow_underscores) { hash = ngx_hash(0, ch); r->lowcase_header[0] = ch; i = 1; } else { r->invalid_header = 1; } break; }
這裡有一個關鍵變數:allow_underscores,是否允許下劃線。
原來nginx對header name的字元做了限制,預設 underscores_in_headers 為off,表示如果header name中包含下劃線,則忽略掉。而我的自定義header中恰巧有下劃線變數。
解決辦法
方法一:
header中自定義變數名時不要用下劃線
方法二:
在nginx.conf中加上underscores_in_headers on配置
http { include mime.types; default_type application/octet-stream; sendfile on; underscores_in_headers on; keepalive_timeout 65; }
參考:
https://blog.csdn.net/loongshawn/article/details/78199977