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

在IIS中用httpplatformhandler部署Flask后如何获取用户真实IP?

解决IIS+HttpPlatformHandler部署Flask时获取真实IP的问题

问题原因

使用HttpPlatformHandler部署时,IIS作为反向代理将请求转发给Flask进程,Flask默认获取到的是IIS的本地地址(127.0.0.1/localhost),需配置IIS将客户端真实IP通过请求头传递给后端。

解决步骤

1. 配置IIS传递真实IP请求头

需借助IIS的URL Rewrite模块(未安装的话,先在服务器管理器的Web服务器角色中添加该组件),通过web.config配置规则注入客户端IP:

编辑站点web.config

在<system.webServer>节点内添加URL重写规则:

<rewrite>
  <rules>
    <rule name="Inject X-Forwarded-For" stopProcessing="true">
      <match url=".*" />
      <serverVariables>
        <!-- 将客户端真实IP写入X-Forwarded-For请求头 -->
        <set name="HTTP_X_FORWARDED_FOR" value="{REMOTE_ADDR}" />
      </serverVariables>
      <action type="None" />
    </rule>
  </rules>
</rewrite>

允许修改Server Variables

打开IIS管理器,选中目标站点(或服务器节点),找到URL Rewrite模块:

  • 点击右侧菜单的View Server Variables
  • 点击Add,输入HTTP_X_FORWARDED_FOR并保存,允许IIS修改该变量

2. 调整Flask代码读取真实IP

修改原有IP获取逻辑,优先读取IIS传递的请求头,处理多层代理场景下的多IP情况:

from flask import request

def get_client_ip():
    # 优先从IIS传递的X-Forwarded-For头获取IP
    ip = request.environ.get('HTTP_X_FORWARDED_FOR', request.remote_addr)
    # 若存在多个IP(如经过CDN/多层代理),取第一个有效IP
    if ',' in ip:
        ip = ip.split(',')[0].strip()
    return ip

备选方案:通过环境变量传递IP

若不想使用URL Rewrite,也可在web.config的<httpPlatform>节点中添加环境变量直接传递X-Real-IP:

<httpPlatform processPath="你的Python路径\python.exe"
              arguments="run.py"
              stdoutLogEnabled="true"
              stdoutLogFile=".\logs\stdout"
              startupTimeLimit="60"
              requestTimeout="00:05:00">
  <environmentVariables>
    <!-- 将客户端IP注入X-Real-IP环境变量 -->
    <environmentVariable name="HTTP_X_REAL_IP" value="{REMOTE_ADDR}" />
  </environmentVariables>
</httpPlatform>

此时原有代码request.environ.get('HTTP_X_REAL_IP', request.remote_addr)即可直接获取真实IP。

内容的提问来源于stack exchange,提问作者David Yang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:45:32