一、X-Real-IP
从字面看 X-Real-IP 代表的是客户端请求真实的 IP 地址,这个参数没有相关标准规范,如果是直接访问的请求,可能是客户端真实的 IP 地址,但是中间若经过了层层的代理,就是最后一层代理的 IP 地址。
Nginx 中的配置
proxy_set_header X-Real-IP $remote_addr;
二、X-Forwarded-For
2.1 语法
X-Forwarded-For: <client>, <proxy1>, <proxy2>
2.2 说明
X-Forwarded-For 记录着从客户端发起请求后访问过的每一个 IP 地址,当然第一个是发起请求的客户端本身的地址,各 IP 地址间由“英文逗号+空格”(,
)分隔。
Nginx 中的配置
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
三、Koa 获取客户端真实的 IP 地址
3.1 通过 HTTP Headers 中的 X-Forwarded-For
相对于 X-Real-IP 的不确定性,X-Forwarded-For 已经写进了 RFC 7239,所以成了获取 IP 地址的首选途径。
const headers = ctx.request.headers const XForwardedFor = headers['x-forwarded-for'] const IP = XForwardedFor.split(', ')[0]
3.2 通过 Koa 自带的接口
当 Koa 收到的请求中 X-Forwarded-For 包含多个 IP 地址时,也就是 X-Forwarded-For: client1, proxy1, proxy2 这样的形式,可以通过
ctx.request.ips
获取到这个 IP 地址列表,值为[client1, proxy1, proxy2]
,ctx.request.ips[0]
是真实客户端 IP 地址(与ctx.request.ip
是同一个 IP 地址,即client1
),数组后面的各个 IP 地址是各级代理的 IP 地址。
const IP = ctx.request.ips[0]