使用nginx做負載均衡或http代理時,碰到http header不轉(zhuǎn)發(fā)的問題。 配置里只有轉(zhuǎn)發(fā)設置原始ip和host的 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Server $host; 但我自定義的header卻都忽略掉了。百思不得其解: 1、理論上轉(zhuǎn)發(fā)header是基本功能啊,apache都沒問題 2、網(wǎng)上也搜不到此類問題說明 3、可能大家都不用客戶端自定義提交header? malcolm說nginx是七層,可能忽略了。讓我用其他的代理服務器 可想用nginx,應用又必須自定義http header。咋辦? 打開nginx的debug: 配置中: daemon off; error_log logs/error.log debug; 看error_log 發(fā)現(xiàn)解析header時出現(xiàn): 2010/12/13 18:49:06 [info] 6248#1476: *1 client sent invalid header line: “wiz_api_version: 2″ while reading client request headers, client: 223.254.100.103, server: localhost, request: “POST /wizkm/a/upload HTTP/1.1″ 明顯是忽略掉了我自定義的header。 差點絕望。還好開源軟件可以看源碼。 找出個所以然,果然被我找到問題了: rc = ngx_http_parse_header_line(r, r->header_in, cscf->underscores_in_headers); if (r->invalid_header && cscf->ignore_invalid_headers) 在ngx_http_parse_header_line() 函數(shù)中 if (ch == ‘_’) { if (allow_underscores) { hash = ngx_hash(hash, ch); r->lowcase_header[i++] = ch; i &= (NGX_HTTP_LC_HEADER_LEN – 1); } else { 紅色部分就是問題所在了 原來是對header name的字符做了限制,默認 underscores_in_headers 為off,表示如果header name中包含下劃線,則忽略掉。 恰好我自定義的header中都是用的下劃線。 處理辦法: 1:配置中http部分 增加underscores_in_headers on; 配置 2:用減號-替代下劃線符號_,避免這種變態(tài)問題。nginx默認忽略掉下劃線可能有些原因。 踏破鐵鞋無處覓 折騰了一天,終于算是解決了。 |
|
來自: 昵稱597197 > 《技術(shù)文章》