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设置
参考技术Anginx代理常用配置项
通过以下的案例来理解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获取真实ip,proxy_set_head设置头部信息的理解