You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:直接存储客户端的原始IP
  • X-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:45:32