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_set_header设置

参考技术A

nginx代理常用配置项

通过以下的案例来理解proxy_set_header设置

其中backend 192.168.4.122 提前安装nginx 第三方模块支持 ""echo"

=============192.168.4.119 proxy1 nginx.conf

=============192.168.4.120 proxy2 nginx.conf

=============192.168.4.121 proxy3 nginx.conf

=============192.168.4.122 backend nginx.conf

=============

有注意到 ||192.168.4.254, 192.168.4.120 是不包含192.168.4.119

proxy_set_header Host $host;
本案例因为不涉及到域名所以用不到$Host值,作用也比较好理解,就是nginx做代理时,把原http请求的Header中的Host字段也放到转发的请求里,如果不加这一行的话,nginx转发的请求header里就不会有Host字段,而服务器是靠这个Host值来区分你的请求的是哪个域名的资源的,

proxy_set_header X-Real-IP $remote_addr;
只能获取到与服务器本身直连的上层请求ip 写入到http请求头中

proxy_set_header X-Real-IP $proxy_add_x_forwarded_for;
定义客户端IP,如果多层代理都有配置这个值,离backent最近的会覆盖之前的值 所以一般只在连接客户端的代理上写添加这条值,这样backend就能获取到客户端的真实IP,单独使用无效

proxy_set_header X-Forwarded-For $http_x_forwarded_for;
把客户端IP写入到http请求头中,前提是之前有X-Real-IP $remote_addr定义过客户端IP,所以单独使用无效

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
相当于 $http_x_forwarded_for 和 $remote_addr和结合 获取上层IP和把客户端IP写入请求头中,

以上是关于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 运维笔记