`
huchangan2005
  • 浏览: 78493 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

nginx有时无法转发自定义header头内容的问题-(转载)

阅读更多

原文地址:http://313968.blog.51cto.com/303968/895672

 

使用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?
 
 
打开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)

 

Unknown macro: {                    hash = ngx_hash(hash, ch);                    r->lowcase_header[i++] = ch;                    i &= (NGX_HTTP_LC_HEADER_LEN -- 1);\                 }

 

else

 

Unknown macro: {                    r->invalid_header = 1;                }

 
红色部分就是问题所在了
原来是对header name的字符做了限制,默认 underscores_in_headers 为off,表示如果header name中包含下划线,则忽略掉。
 
恰好我自定义的header中都是用的下划线。
 
处理办法:
 
1:配置中http部分 增加underscores_in_headers on; 配置
2:用减号-替代下划线符号_,避免这种变态问题。nginx默认忽略掉下划线可能有些原因。

分享到:
评论

相关推荐

    php获取不到自定义header参数原因详解

    然而,有时我们可能会遇到PHP无法正确获取自定义Header参数的问题。本篇文章将详细解析这一问题,并提供解决方案。 首先,理解PHP如何处理HTTP头至关重要。PHP本身并不直接处理HTTP请求,而是通过服务器环境变量来...

    Nginx跨域设置Access-Control-Allow-Origin无效的解决办法

    nginx 版本 1.11.3 使用大家说的以下配置,验证无效,跨域问题仍然存在 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow...

    教你怎么用Nginx往request的header中添加新字段

    结合提供的文件名,我们可以推断,`2nginx response.png`可能展示了Nginx添加自定义响应头的结果,`1request header中添加apiversion.png`可能描绘了在请求头中添加`apiversion`字段的过程,而`Nginx居然还能实现...

    nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

    (a)客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。 (b)后端服务器处理完请求,将响应数据返回给nginx。 (c)此时nginx生成带route的cookie,返回给...

    nginx-upstream-jvm-route-1.15

    upstream模块是实现这一功能的关键部分,它允许我们定义一组服务器,Nginx会根据预设的策略(如轮询、最少连接、IP哈希等)将请求转发到这些服务器。 在"nginx-upstream-jvm-route"中,"jvm-route"表示Nginx与Java...

    Nginx代理时header头中带”_”信息丢失问题的解决

    开发网关项目时,在请求时往请求头header中放入了签名sign_key信息,在接收请求时再从header中拿出,在本地调试时是可以的,但上线之后通过Nginx代理之后发现拿不到。 location / { proxy_set_header X-Real-IP $...

    nginx + nginx-http-flv-module-1.2.9

    在 `logs` 目录下,Nginx 的日志文件记录了服务器的运行状态和错误信息,这对于诊断问题和优化性能至关重要。`nginx` 和 `nginx.pid` 可能是用于启动和停止 Nginx 服务的脚本和进程 ID 文件。 7. **源代码** `src...

    headers-more-nginx-module-0.34

    《headers_more_nginx_module_0.34:深入解析Nginx扩展模块的增强功能》 在Web服务器领域,Nginx以其高性能、高并发能力而广受赞誉。而headers_more_nginx_module作为Nginx的一个扩展模块,进一步提升了其在处理...

    Nginx解决转发地址时跨域的问题

    一、什么是跨域问题 在一个服务器A里放置了json文件,另一个服务器B想向A发送ajax请求,获取此文件,会发生错误。 Chrome提示: XMLHttpRequest cannot load ******. No 'Access-Control-Allow-Origin' header is ...

    nginx配置tcp转发(nginx通过白名单访问)

    在Nginx中配置TCP转发,可以将客户端的TCP请求透明地转发到后端服务器,实现负载均衡、安全控制等功能。 要配置Nginx进行TCP代理转发,我们需要创建一个新的Nginx配置文件,通常放在`/etc/nginx/conf.d/`目录下,...

    Nginx转发WebSocket接口配置方式

    这些设置会影响Nginx如何存储来自后端服务器的数据,防止因缓冲区不足导致的问题。 5. **错误处理**:为避免WebSocket连接中的异常情况,如后端服务器下线,可以添加错误页面或者重试机制。例如: ```nginx ...

    Nginx作为反向代理时传递客户端IP的设置方法

    因为架构的需要采用多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。 同样适用于前端是 Squid 或者...

    nginx + header 转发 灰度测试

    nginx Header 转发灰度测试配置详解 在本文中,我们将详细介绍如何使用 Nginx 实现 Header 转发灰度测试。灰度测试是一种重要的测试方法,可以帮助我们在不影响生产环境的情况下,测试新的服务或功能。我们将使用 ...

    nginx转发sftp、ftp的配置

    ### Nginx 转发 SFTP 和 FTP 的配置详解 #### 一、引言 在互联网技术领域中,Nginx(发音为 “engine X”)是一款高性能的HTTP和反向代理服务器,同时它也支持邮件代理服务。随着版本的不断更新与优化,Nginx 在...

    windows平台nginx编译nginx-http-flv-module

    它广泛用于静态资源服务、动态内容转发和负载均衡等场景。 **HTTP FLV Module**是Nginx的一个扩展模块,主要用于支持流媒体服务,特别是Flash Video(FLV)格式的实时流传输。这个模块允许Nginx直接处理FLV流,使得...

    nginx-1.10.2_海康;javascript_nginx/1.10.2_nginx转发海康_

    javascript_nginx/1.10.2_nginx转发海康_"表明我们讨论的主题是关于Nginx 1.10.2版本,特别是如何利用它来实现对海康摄像头的实时预览功能,并涉及到JavaScript在其中的作用。海康摄像头是一种广泛应用的安防监控...

    为何要小心Nginx的add_header指令详解

    大家都知道,nginx配置文件通过使用add_header指令来设置response header。 昨天无聊用curl查看一个站点的信息,发现返回的头部与想象中的不一样: HTTP/2 200 date: Thu, 07 Feb 2019 04:26:38 GMT content-type: ...

    添加nginx-http-flv-module模块并重新编译后的nginx(windows版)

    在IT行业中,Nginx是一款广泛应用的高性能Web服务器和反向代理服务器,它以...如果你需要自定义Nginx的配置或更新模块,可以根据上述步骤进行操作。同时,理解Nginx的编译和配置过程对于管理和优化服务器性能至关重要。

    nginx-add-custom-header:nginx使用lua扩展添加一个自定义的头

    nginx-add-custom-header 简介 使用openresty写的一个扩展。 添加一个自定义的header--x-mls-logid,用来追踪接口之间的调用流程。 测试环境 MacOSX 10.10.3 8GB i5 openresty 1.7.2.1 PHP 5.4.38 测试结果 使用wrk...

    nginx上传下载之nginx-upload-module-2.3.0

    接下来,你需要编辑 Nginx 的配置文件(通常位于 `/etc/nginx/nginx.conf` 或 `/usr/local/nginx/conf/nginx.conf`),添加对 Nginx Upload Module 的支持。首先备份原配置文件: ```bash sudo cp /etc/nginx/nginx...

Global site tag (gtag.js) - Google Analytics