proxy_set_header和X-Forwarded-For

proxy_set_header

This directive allows to redefine and to add some request header lines which will be transferred to the proxied server.

这个不是change而是add,我了割草....我分析了好久日志才发现,然后对照官网,果不其然

ex:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,由于默认是空,所以也可以理解为change,但是切记不要搞乱


X-Forwarded-For

X-Forwarded-For: client1, proxy1, proxy2

The X-Forwarded-For (XFF) HTTP header is a de facto standard for identifying the originating IP address of a client connecting to a web server through an HTTP proxy or load balancer. This is a non-RFC-standard request header which was introduced by the Squid caching proxy server's developers.

这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,

每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址

由于他是非rfc标准,所以默认是没有的,需要强制添加

在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip

└(^o^)┘

下面来分析请求头到达Nginx负载均衡服务器的情况;在默认情况下,Nginx并不会对X-Forwarded-For头做任何的处理,除非用户使用proxy_set_header 参数设置:
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr 用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr。

$remote_addr变量的值是客户端的IP

当Nginx设置X-Forwarded-For等于$proxy_add_x_forwarded_for后会有两种情况发生

1、如果从CDN过来的请求没有设置X- Forwarded-For头(通常这种事情不会发生),而到了我们这里Nginx设置将其设置为$proxy_add_x_forwarded_for 的话,X-Forwarded-For的信息应该为CDN的IP,因为相对于Nginx负载均衡来说客户端即为CDN,这样的话,后端的web程序时死活 也获得不了真实用户的IP的。

2、CDN设置了X-Forwarded-For,我们这里又设置了一次,且值为$proxy_add_x_forwarded_for的话,那么 X-Forwarded-For的内容变成 ”客户端IP,Nginx负载均衡服务器IP“如果是这种情况的话,那后端的程序通过X-Forwarded-For获得客户端IP,则取逗号分隔的第一 项即可。

如上两点所说,如果我们知道了CDN设置了X-Forwarded-For信息,且只有客户端真实的IP的话,那么我们的Nginx负载均衡服务器可以不必理会该头,让它默认即可。

其实Nginx中还有一 个$http_x_forwarded_for变量,这个变量中保存的内容就是请求中的X-Forwarded-For信息。如果后端获得X- Forwarded-For信息的程序兼容性不好的话(没有考虑到X-Forwarded-For含有多个IP的情况),最好就不要将X- Forwarded-For设置为 $proxy_add_x_forwarded_for。应该设置为$http_x_forwarded_for或者干脆不设置!


Code block   
测试环境: nginx+resin
IP: 内网:172.16.100.10
 
客户端IP:123.123.123.123
 
测试页面: test.jsp
<%
out.println("x-forwarded-for: " + request.getHeader("x-forwarded-for"));
out.println("remote hosts: " + request.getRemoteAddr());
%>
 
nginx 配置一
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
wget测试
wget -O aa --header="X-Forwarded-For:192.168.0.1" "http://2hei.net/test.jsp"
页面返回结果:
x-forwarded-for: 192.168.0.1, 123.123.123.123
remote hosts: 172.16.100.10
 
curl测试
curl -H "X-Forwarded-For:192.168.0.1" "http://2hei.net/test.jsp"
x-forwarded-for: 192.168.0.1, 123.123.123.123
remote hosts: 172.16.100.10
 
nginx 配置二
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
wget测试:
wget -O aa --header="X-Forwarded-For:192.168.0.1" "http://2hei.net/test.jsp"
页面返回结果:
x-forwarded-for: 123.123.123.123
remote hosts: 172.16.100.10
 
curl测试
curl -H "X-Forwarded-For:192.168.0.1" "http://2hei.net/test.jsp"
x-forwarded-for: 123.123.123.123
remote hosts: 172.16.100.10
 
测试结果:
1、配置  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
增加了一个真实ip X-Forwarded-For,并且顺序是增加到了“后面”。
 
2、配置  proxy_set_header X-Forwarded-For $remote_addr;
清空了客户端伪造传入的X-Forwarded-For,
保证了使用request.getHeader("x-forwarded-for")获取的ip为真实ip,
或者用“,”分隔,截取X-Forwarded-For最后的值。

转载于:https://www.cnblogs.com/huangjingzhou/articles/2155892.html

proxy_set_header X-Forwarded-Proto是用来设置HTTP请求头中的X-Forwarded-Proto字段的。这个字段用于指示客户端与代理服务器之间的传输协议,比如http或https。\[1\]在Nginx的配置中,可以使用proxy_set_header指令来设置X-Forwarded-Proto字段的值。例如,可以使用以下配置来设置X-Forwarded-Proto字段的值为http或https: ``` proxy_set_header X-Forwarded-Proto http; ``` 或 ``` proxy_set_header X-Forwarded-Proto https; ``` 这样,当Nginx作为代理服务器转发请求时,会将X-Forwarded-Proto字段添加到请求头中,并将其值设置为http或https,以指示客户端与代理服务器之间的传输协议。\[1\] 在Nginx的标准配置示例中,可以看到proxy_set_header指令被用来设置X-Forwarded-Proto字段的值。例如: ``` server { listen 80; server_name www.xxx.com; location / { proxy_pass http://xxx.com; proxy_set_header host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` 在这个配置中,proxy_set_header指令被用来设置X-Forwarded-Proto字段的值为$scheme,$scheme是一个Nginx内置变量,它会根据请求的传输协议自动设置为http或https。这样,X-Forwarded-Proto字段的值会与请求的传输协议保持一致。\[2\] 另外,如果在Nginx的配置中使用了proxy_pass指令来进行请求转发,可以通过在proxy_pass后面添加斜杠来指定转发的路径。例如: ``` location /abc/ { proxy_pass http://10.1.12.123:8080; } ``` 或 ``` location /abc/ { proxy_pass http://10.1.12.123:8080/; } ``` 这两种配置的区别在于,第一种配置会将原始请求的路径(比如/abc/def)直接转发给后端服务器,而第二种配置会将原始请求的路径(比如/abc/def)转发给后端服务器的/abc/路径下。\[3\] #### 引用[.reference_title] - *1* [nginx-反向代理是设置传输协议http/https](https://blog.csdn.net/qq522044637/article/details/127496804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [nginx反向代理proxy_set_header说明](https://blog.csdn.net/jialiu111111/article/details/128041466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [proxy_pass和proxy_set_header浅析](https://blog.csdn.net/qq_45812488/article/details/124236969)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值