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



相关文章
|
1月前
|
自然语言处理 大数据 应用服务中间件
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
51 5
|
9天前
|
应用服务中间件 API nginx
nginx配置反向代理404问题
【10月更文挑战第18天】本文介绍了使用Nginx进行反向代理的配置方法,解决了404错误、跨域问题和302重定向问题。关键配置包括代理路径、请求头设置、跨域头添加以及端口转发设置。通过调整`proxy_set_header`和添加必要的HTTP头,实现了稳定的服务代理和跨域访问。
nginx配置反向代理404问题
|
30天前
|
负载均衡 应用服务中间件 Linux
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
这篇博客文章详细介绍了Nginx的下载、安装、配置以及使用,包括正向代理、反向代理、负载均衡、动静分离等高级功能,并通过具体实例讲解了如何进行配置。
134 4
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
|
1月前
|
Docker 容器
docker nginx-proxy 添加自定义https网站
docker nginx-proxy 添加自定义https网站
32 4
|
1月前
|
应用服务中间件 nginx
nginx反向代理与证书设置
nginx反向代理与证书设置
38 3
|
1月前
|
负载均衡 算法 应用服务中间件
nginx反向代理与负载均衡
nginx反向代理与负载均衡
32 1
|
2月前
|
JavaScript Java 应用服务中间件
|
1月前
|
JavaScript 应用服务中间件 开发工具
vue尚品汇商城项目-day07【53.nginx反向代理配置】
vue尚品汇商城项目-day07【53.nginx反向代理配置】
32 4
|
1月前
|
缓存 安全 应用服务中间件
nginx配置proxy_set_header
nginx配置proxy_set_header