byourb 2017-04-27
关键字:
问题描述:
通过nginx反向代理到tomcat,自定义Header中,其中带下划线的Hdader在tomcat应用中获取不到,类似于n_name/cookie_sig这样的名称;
处理办法:
1:配置中http部分增加underscores_in_headerson;配置
2:用减号-替代下划线符号_,避免这种变态问题。nginx默认忽略掉下划线可能有些原因。
原因(有时间的可以了解下根源):
明显是忽略掉了我自定义的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()函数中
if(ch==‘_’){
if(allow_underscores){
hash=ngx_hash(hash,ch);
r->lowcase_header[i++]=ch;
i&=(NGX_HTTP_LC_HEADER_LEN–1);
}else{
r->invalid_header=1;
}
红色部分就是问题所在了
原来是对headername的字符做了限制,默认underscores_in_headers为off,表示如果headername中包含下划线,则忽略掉。恰好我自定义的header中都是用的下划线。
某些公司会墙特定网站,如果你有一个可访问的域名和服务器,就可以通过nginx反向代理来来解决这些问题。比如现在我们用mirror.example.com镜像www.baidu.com,以下是详细操作。