X-Real-IP 与 X-Forwarded-For

一、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]

四、参考

发表评论

电子邮件地址不会被公开。 必填项已用*标注