码迷,mamicode.com
首页 > 其他好文 > 详细

X-Forwarded-For和相关几个头部的理解

时间:2016-03-09 07:09:17      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:http   x forwarded for   


$remote_addr 

nginx与客户端进行TCP连接过程中,获得的客户端真实地址. Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求

 

X-Real-IP

又是一个自定义头。X-Real-Ip 通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端。需要注意的是,X-Real-Ip 目前并不属于任何标准,代理和 Web 应用之间可以约定用任何自定义头来传递这个信息

 

X-Forwarded-For

X-Forwarded-For 是一个扩展头。HTTP/1.1RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP,现在已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239Forwarded HTTP Extension)标准之中.

  X-Forwarded-For请求头格式非常简单,就这样:

  X-Forwarded-For:client, proxy1, proxy2

  可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP

如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1Proxy2Proxy3IP 分别为 IP1IP2IP3,用户真实 IP IP0,那么按照 XFF 标准,服务端最终会收到以下信息:

  X-Forwarded-For: IP0, IP1, IP2

Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮Proxy2 转发请求。列表中并没有 IP3IP3 可以通过服务端的 Remote Address 字段获得。我们知道 HTTP 连接基于 TCP 连接,HTTP 协议中没有 IP 的概念,Remote Address 来自 TCP 连接,表示与服务端建立 TCP 连接的设备 IP,在这个例子里就是 IP3

 

如果一个反向代理nginx服务器中配置了这两项:

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

 

那么这里就是把真实的客户端地址$remote_addr赋值给X-Real-IP。注意,如果客户端是经过CDN或其他反向代理再过来的话,那么这个remote_addr地址就是CDN或反代的地址了。

$proxy_add_x_forwarded_for是把反向代理本机的IP加到X-Forwarded-For上。举例:如果上一层连过来的是CDN,它设置了X-Forwarded-For(一般CDN会把自己的IP隐藏只留客户端IP),我们这里又设置了一次,且值为$proxy_add_x_forwarded_for的话,那么X-Forwarded-For的内容变成”客户端IP,Nginx负载均衡服务器IP“。所以,如果知道CDN设置了X-Forwarded-For,且只有客户端真实IP的话,那么我们的Nginx可以不必理会该头,让它默认即可

 

$http_x_forwarded_for

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


X-Forwarded-For和相关几个头部的理解

标签:http   x forwarded for   

原文地址:http://dengxi.blog.51cto.com/4804263/1748924

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!