在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
相关产品推荐
相关产品推荐

