一些Nginx内置变量

后端 0 596 0
发表于: 2022-12-01 01:38:26

简介: mark~

$remote_addr

代表客户端 IP,这里的客户端指的是直接请求 Nginx 的客户端,非间接请求的客户端(即不管中转了几次,都是拿到最上层的用户 IP)。

假设用户请求过程如下

用户客户端 --> 发送请求 --> Nginx1 ---> 转发请求 --> Nginx2 --> 后端服务器

那么,默认情况下,针对 Nginx1 而言,$remote_addr为用户客户端 IP,对 Nginx2 而言,$remote_addr则为 Nginx1 的 IP。此时如果希望 Nginx2 也可以获取用户客户端 IP,那要怎么处理呢?答案如下:

在 Nginx1 配置文件中使用proxy_set_header为转发请求设置请求头

# X-Real-IP 为请求头名称,可自定义
proxy_set_header X-Real-IP $remote_addr;

然后,在 Nginx2 配置文件中通过$http_x_real_ip来获取X-Real-IP请求头的值来获取真实客户端 IP.

此时,如果要求“后端服务器”也要获取用户客户端 IP,咋处理呢?做法和上述类似,在 Nginx2 配置文件中,使用proxy_set_header做同样的配置,即:

# X-Real-IP 为请求头名称,可自定义
proxy_set_header X-Real-IP $remote_addr;

然后,“后端服务器”获取请求头“X-Real-IP”的值即为用户客户端 IP。

很多 HTTP 代理会在 HTTP 协议头中添加X-Forwarded-For头,用来追踪请求的来源。X-Forwarded-For的格式如下:

X-Forwarded-For包含多个 IP 地址,每个值通过逗号+空格分开,最左边(client1)是最原始客户端的 IP 地址,中间如果有多层代理,每一层代理会将连接它的客户端 IP 追加在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变量的客户端请求头X-Forwarded-For ,其值如果包含多个地址,用逗号+空格分隔,标准格式如下:

X-Forwarded-For: clientIP, proxyIP1, proxyIP2 # 最左边的clientIp即为客户端真实IP