当使用 Nginx 反向代理的时候,在 Express 通过 req
获取客户端信息时,默认情况,获取到的是 Nginx 端的信息。比如:req.ip
的值可能是 127.0.0.1,而不是实际访问我们网站用户的客户端信息。要想获取实际客户端信息需要做如下配置:
Express 中配置
app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal','47.240.113.45'])
Nginx 中配置
在 location
中添加 header 信息
#
# proxy_set_header Host $host;
# 客户端 IP 地址
# proxy_set_header X-Real-IP $remote_addr;
# 客户端 host 转发, 即域名部分
proxy_set_header X-Forwarded-Host $host;
# 客户端 IP 地址转发
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 协议转发 HTTP or HTTPS
proxy_set_header X-Forwarded-Proto $scheme;
参考文档地址:https://expressjs.com/zh-cn/guide/behind-proxies.html
通过上述配置后,
req.hostname
为客户端实际使用的域名地址
req.protocol
为客户端实际使用的协议 HTTP or HTTPS
req.ip
为客户端实际的 IP 地址
req.ips
为客户端实际的 IP 地址以及信任的中间代理的地址,(比如上面设置的 47.240.113.45
),如果没有设置该地址,如果通过这里反向代理访问的,该地址为客户端地址,
实际响应演示: https://www.yidiankuaile.com/v1/status
本文链接 https://www.yidiankuaile.com/post/nginx-reverse-proxy-express