今天遇到一个问题,就是使用Cloudflare后Outsystems获取客户端真实IP地址的问题,是这样的,当使用Outsystems开发的项目部署到Microsoft Azure后,并且套了CDN,当然就是Cloudflare啦,调用GetIP这个action被发现总是拿到的是同一个地址,于是排查后就有了本文了。
使用Cloudflare后Outsystems获取客户端真实IP地址
OutSystems使用Cloudflare后如何获取真实IP?当我们将OutSystems开发的Web项目部署到服务器并使用Cloudflare时,如果我们想获取客户端的真实IP地址,我们不能简单地调用HTTPRequestHandler提供的GetIP动作。如果你这样做,你将得到的只是一个Cloudflare代理地址。
OutSystems使用Cloudflare后如何获取真实IP
正是因为我们使用了Cloudflare,所以无法通过直接调用GetIP动作来获取真实的IP地址。关于这方面,Cloudflare社区中有关于这方面的讨论,我们可以在这里查看。
所有与 Cloudflare 的 HTTP 连接都会在标头中返回访客 IP 地址:
X-Forwarded-For 标头
CF-Connecting-IP 标头
了解了以上原因之后,剩下的就很简单了。我们只需要调用 GetRequestHeader 来获取对应的 Header,这样我们就可以获取到客户端的真实 IP 地址。
使用 Cloudflare 时,您的服务器看到的 IP 地址是 Cloudflare 代理的 IP,而不是发出请求的客户端的真实 IP。要在 OutSystems 应用程序中获取真实的客户端 IP,您可以从 Cloudflare 设置的 HTTP 标头中检索它。Cloudflare 通常会在标头中发送真实的 IP 地址。CF-Connecting-IP
以下是在OutSystems中执行此操作的方法:
在OutSystems中检索真实客户端IP的步骤:
- 访问请求标头:
- 在 OutSystems 中,您可以使用模块中的操作来访问请求标头。
GetRequestHeader
HTTPRequestHandler
- 使用操作获取标头的值。
CF-Connecting-IP
- 设置逻辑以提取 IP:
- 创建一个服务器操作,该操作作为标头名称调用和传递。
GetRequestHeader
"CF-Connecting-IP"
- 此操作的输出将是客户端的真实 IP 地址。
示例实现:
- 添加服务器操作:
- 创建新的服务器操作,例如 .
GetClientIP
- 在此操作中,使用模块中的操作。
GetRequestHeader
HTTPRequestHandler
- 配置
GetRequestHeader
:
- 将输入参数设置为 。
HeaderName
"CF-Connecting-IP"
- 返回 IP:
- 的输出将是客户端的真实 IP 地址。将此设置为操作的输出。
GetRequestHeader
GetClientIP
示例代码:
HeaderName =“CF-Connecting-IP” ClientIP = HTTPRequestHandler。GetRequestHeader(HeaderName)
OutSystems使用Cloudflare后如何获取真实IP?
其它注意事项:
- 如果您的应用程序前面有多个代理或层,则可能需要检查其他标头,例如 addition 。
X-Forwarded-For
CF-Connecting-IP
调试:
- 确保 Cloudflare 已配置为发送此标头。
- 测试您的应用程序以确保返回正确的 IP,尤其是在您位于多个代理后面时。
通过执行这些步骤,您的 OutSystems 应用程序将能够检索真实的客户端 IP 地址,即使在 Cloudflare 后面也是如此。