nginx反向代理proxy_set_header自定义header头无效的问题

简介:

###案例1
环境nginx,linux,tomcat
域名访问是走nginx给后端服务器处理的,
问题是域名经过nginx访问直接不能获取到headers,直接tomcat访问可以
那么问题肯定在nginx上无法处理headers的问题了, 经过查询上面资料得到是nginx的锅,hearders有下划线的锅,nginx设置underscores_in_headers on,参照上面配置说。就可以处理,
测试:
http://apistore.baidu.com/astore/toolshttpproxy
API工具:GET
http://www.***.com/api/user/info.json?user_id=10000050&ouser_id=10000051

Headers

Headers  user_id   888888888888888888


tomcat日志下可获取
url=/api/user/info.json?user_id=10000050&ouser_id=10000051

para_user_id=10000050

head_user_id=888888888888888888 



不改
underscores_in_headers on之前 head_user_id=null



后来找相关资料才得知都是文件头带下划线的锅:



参考资料:

nginx 做proxy 不转发 http header问题解决


http://blog.csdn.net/wx_mdq/article/details/10466891

使用nginx做负载均衡或http代理时,碰到http header不转发的问题。

 

配置里只有转发设置原始ip和host的

 

 

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header     X-Forwarded-Server $host;

 

 

但我自定义的header却都忽略掉了。百思不得其解:

 

1、理论上转发header是基本功能啊,apache都没问题

2、网上也搜不到此类问题说明

3、可能大家都不用客户端自定义提交header?

 

malcolm说nginx是七层,可能忽略了。让我用其他的代理服务器

 

可想用nginx,应用又必须自定义http header。咋办?

 

打开nginx的debug:

 

配置中:

daemon off;

error_log logs/error.log debug;

 

看error_log

发现解析header时出现:

 

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() 函数中

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;
                }

 

红色部分就是问题所在了

原来是对header name的字符做了限制,默认 underscores_in_headers 为off,表示如果header name中包含下划线,则忽略掉。

 

恰好我自定义的header中都是用的下划线。

 

处理办法:

 

1:配置中http部分 增加underscores_in_headers on; 配置

2:用减号-替代下划线符号_,避免这种变态问题。nginx默认忽略掉下划线可能有些原因。

 

 

踏破铁鞋无处觅  折腾了一天,终于算是解决了。

 







参考资料:

http://www.ttlsa.com/nginx/nginx-proxy_set_header/ 

nginx反向代理proxy_set_header自定义header头无效


公司使用nginx作为负载均衡,有时候需要自定义header头发送给后端的真实服务器. 想过去应该是非常的简单的事情.

例子如下:

设置代理服务器ip头

1

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

然后自己在自定义个header,remote_header_test,如下:

1

proxy_set_header remote_header_test "123123123";

接着后端真实服务器打开www.ttlsa.com/nginx_header.php

源代码是简单的phpinfo

1

2

3

4

5

<?php

 

phpinfo();

 

?>

在phpinfo结果页面中搜索刚才设置的头部,发现没有找到,网上查找资料,才发现原来nginx会忽略掉下划线的头部变量.于是改成如下:

1

proxy_set_header remoteheadertest "123123123";

再次打开www.ttlsa.com/nginx_header.php,搜索remoteheadertest,有内容. 看来果真不能用下划线. 然后改成'-',如下:

1

proxy_set_header remote-header-test "123123123";

打开页面,搜索到的头部是remote_header_test. 自动转换成下划线了.

如果想要支持下划线的话,需要增加如下配置:

1

underscores_in_headers on;

可以加到http或者server中

语法:underscores_in_headers on|off
默认值:off
使用字段:http, server
是否允许在header的字段中带下划线


 
 

本文转自 holy2009 51CTO博客,原文链接:http://blog.51cto.com/holy2010/1840481



相关文章
|
3月前
|
JSON 应用服务中间件 API
利用Grafana的API Key+Nginx反向代理实现Grafana免登录访问
利用Grafana的API Key+Nginx反向代理实现Grafana免登录访问
87 1
|
12天前
|
应用服务中间件 nginx
nginx进行反向代理的配置
在Nginx中设置反向代理的步骤:编辑`/etc/nginx/nginx.conf`,在http段加入配置,创建一个监听80端口、服务器名为example.com的虚拟主机。通过`location /`将请求代理到本地3000端口,并设置代理头。保存配置后,使用`sudo nginx -s reload`重载服务。完成配置,通过example.com访问代理服务器。
18 0
|
1月前
|
存储 C++ 容器
set容器一自定义数据类型指定排序规则讲解
set容器一自定义数据类型指定排序规则讲解
15 1
|
1月前
|
负载均衡 应用服务中间件 Linux
|
2月前
|
tengine Rust 负载均衡
反向代理学习笔记(一) Nginx与反向代理绪论
反向代理学习笔记(一) Nginx与反向代理绪论
|
2月前
|
负载均衡 Java 应用服务中间件
|
2月前
|
消息中间件 关系型数据库 MySQL
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
60 0
|
3月前
|
应用服务中间件 nginx
4.5.1 Nginx反向代理与系统参数配置conf原理
4.5.1 Nginx反向代理与系统参数配置conf原理
|
测试技术 应用服务中间件 nginx
|
19天前
|
运维 前端开发 应用服务中间件
LNMP详解(八)——Nginx动静分离实战配置
LNMP详解(八)——Nginx动静分离实战配置
24 0