Nginx proxy_set_header 理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx proxy_set_header 理解相关的知识,希望对你有一定的参考价值。

参考技术A

nginx proxy_set_header
允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义:

如果启用缓存,来自之前请求的头字段“If-Modified-Since”, “If-Unmodified-Since”, “If-None-Match”, “If-Match”, “Range”, 和 “If-Range” 将不会被代理服务器传递。
一个不会变化的“Host”头请求字段可通过如下方式被传递:

然后,当字段不在请求头中就无法传递啦。在这种情况下,可通过设置Host变量,将需传递值赋给Host变量。

此外,服务器名称和端口一起通过代理服务器传递。

如果请求头的存在空的字段将不会通过代理服务器传递出去。

总结:proxy_set_header 就是可设置请求头-并将头信息传递到服务器端。不属于请求头的参数中也需要传递时 重定义下就行啦。

测试jsp 想获取客户端IP、客户端port、代理服务器IP、代理服务器port

测试结果

Nginx日志

其中客户端IP不能获取到,而通过request.getRemoteAddr();获取的IP是代理服务器IP,而不是客户端IP,而在nginx中$remote_addr变量的值是客户端的IP,可见remoteaddr没有传递。
而server_port值也不对,当前值为5800,当前打印出的是80。
而当前代理为 http://test 所有通过host得到的是test。
客户端port也获取不到值为20508,可传给应用的是58828

测试页面改成:

测试结果:

Nging日志:

除request.getRemoteAddr();获取的值不对外,其他值都是对的。
getRemoteAddr获取的是代理的请求地址。
因重定义了host,所以test值被改写成代理服务器IP。
因重定义了 X-Real-PORT-并传递$remote_port,客户端port也获取正确啦。
弄清楚是怎么传值的,正确的使用Nginx又向前进了一步。

Nginx中proxy_pass/proxy_redirect/proxy_set_header配置说明

参考技术A

实现将请求转发到其他服务器。

为 location 映射的服务器设置协议、地址、URI。

设置对代理服务器响应头中的 Location 和 Refresh 字段的重写。

转发请求到代理服务器时该指令允许重新定义或者追加消息头中的字段。

自带参数可以通过 proxy_set_header 指令使用。

$proxy_host

在 proxy_pass 指令中定义的代理服务器的名称和端口

$proxy_port

在 proxy_pass 指令中定义的代理服务器的端口,或者是指定协议的默认端口

$proxy_add_x_forwarded_for

表示客户端请求头中的 X-Forwarded-For 字段,该字段中包含 $removte_addr 变量,通过逗号 , 分隔。如果客户端请求头中没有出现X-Forwarded-For 字段, remote_addr`。

ngx_http_proxy_module中的其他参数请参考 官方网站

spring web service系列1
spring web service系列2
spring web service系列3
maven配置文件settings.xml详解
Nginx转发请求过程解析
Nginx中的负载均衡算法
Nginx upstream指令配置说明
Nginx中虚拟服务器server指令配置说明
Nginx中ngx_http_core_module相关指令配置说明
Java自带JVM监控工具jstat使用详细说明
Java自带JVM监控工具jps使用详细说明
Java自带故障分析工具jmap工具使用说明
Java自带故障分析工具jhat工具使用说明

以上是关于Nginx proxy_set_header 理解的主要内容,如果未能解决你的问题,请参考以下文章

Nginx proxy_set_header 理解

Nginx proxy_set_header设置

关于nginx获取真实ip,proxy_set_head设置头部信息的理解

nginx的proxy_set_header

Nginx指令add_header和proxy_set_header的区别

nginx反向代理中proxy_set_header 运维笔记