以我个人为例,我的前端应用是用 1Panel
面板,网站搭建是用的 OpenResty,当我们配置一个反向代理到本地后端服务时,我们可以看到源文:
location ^~ /api {
rewrite ^/api(.*) $1 break; # 重写规则,将/api之后的路径提取出来并去掉/api前缀
proxy_pass http://127.0.0.1:6689;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; // 设置 X-Real-IP 头为客户端的真实 IP 地址。这对于后端服务识别客户端 IP 地址非常重要,特别是在请求经过多个代理的情况下
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; // 设置 X-Forwarded-For 头为通过 proxy_add_x_forwarded_for 指令添加的信息。此头通常用于跟踪客户端 IP 地址以及任何之前的代理 IP 地址
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header X-Cache $upstream_cache_status;
add_header Cache-Control no-cache;
proxy_ssl_server_name off;
}
我们可以写一个方法来获取代理后的地址:
import { Request } from 'express';
/**
* @description: 获取客户端真实 IP
* @param {Request} req
*/
export const getRealIp = (req: Request): string => {
const result = req.headers['x-forwarded-for'] || req.headers['x-real-ip'] || req.socket.remoteAddress || req.ip;
return Array.isArray(result) ? result[0] : result;
};
在代码中使用:
login(@Body() body: LoginParamsDto, @Session() session: CommonType.SessionInfo, @Req() req: Request) {
return this.authService.login(body, session, getRealIp(req));
}