Python+Flask+Nginx环境下获取客户端IP的最佳方法
解决Flask+Nginx部署下获取客户端真实IP的问题
当Nginx作为反向代理时,Flask默认拿到的request.remote_addr是Nginx服务器的IP(通常是127.0.0.1)——这是因为请求实际是从Nginx转发到Flask的。要获取客户端真实IP,需要从Nginx传递相关请求头,再在Flask中正确读取。
第一步:配置Nginx传递客户端IP
在你的Nginx站点配置文件(比如/etc/nginx/sites-available/your-app.conf)的location /块中,添加以下代理头配置:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
X-Real-IP:直接存储客户端的原始IPX-Forwarded-For:存储整个代理链的IP列表,格式为客户端IP, 代理1IP, 代理2IP...,第一个值就是客户端真实IP
如果你的Nginx前端还有其他代理(比如CDN、负载均衡器),为了防止IP伪造,需要配置Nginx只信任特定代理的IP:
# 添加信任的代理IP/IP段 set_real_ip_from 127.0.0.1; set_real_ip_from 10.0.0.0/8; # 示例内部代理段,根据实际情况修改 real_ip_header X-Forwarded-For; real_ip_recursive on;
配置后,Nginx会自动解析出真实的客户端IP,同时忽略非信任代理发送的伪造头。
第二步:Flask中获取真实IP
在Flask代码中,通过读取Nginx传递的请求头来获取客户端IP,不要直接用request.remote_addr:
from flask import request def get_client_real_ip(): # 优先读取X-Forwarded-For,取第一个有效IP xff = request.headers.get('X-Forwarded-For') if xff: # 拆分并去除空白字符,取第一个非空IP ip = xff.split(',')[0].strip() if ip: return ip # 其次读取X-Real-IP xri = request.headers.get('X-Real-IP') if xri: return xri.strip() # 最后 fallback 到remote_addr(无代理场景) return request.remote_addr
之后你就可以调用get_client_real_ip()来获取真实IP,用于后续地理定位逻辑。
内容的提问来源于stack exchange,提问作者asapbeet
相关产品推荐
相关产品推荐

