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

GAE使用Cloudflare反向代理时如何在请求日志中记录真实用户IP

解决方案

方案1:配置GAE信任Cloudflare的IP段(最推荐,无代码修改,原生日志直接生效)

GAE的负载均衡默认仅信任GCP内部的代理IP,只要将Cloudflare的官方公开IP段添加到GAE的可信代理列表,GAE会自动从X-Forwarded-For请求头中提取最左侧的真实用户IP,直接写入原生请求日志的remoteIp字段,不需要额外写代码上报日志。
操作步骤:

  • 首先获取Cloudflare官方公布的全量IPv4、IPv6地址段
  • 若使用GAE标准环境,在app.yaml中添加如下配置:
runtime: nodejsXX # 替换为你的实际Node.js版本
env: standard
network:
  trusted_ip_ranges:
    - 173.245.48.0/20
    - 103.21.244.0/22
    # 其余Cloudflare公开IP段依次列在此处
  • 若使用GAE灵活环境,需要在VPC网络的负载均衡配置中添加Cloudflare IP段为可信代理

注意:Cloudflare的IP段会不定期更新,需要定期同步更新配置,避免信任失效。

方案2:使用Cloud Logging Router规则重写日志字段(无代码修改,适配IP动态更新场景)

如果不想维护Cloudflare的IP段,可直接配置日志路由的重写规则,在日志入库时自动替换原生请求日志的remoteIp值:

  • 进入GCP控制台的「日志路由器」页面,新建一个接收器
  • 过滤规则选择匹配GAE原生请求日志:resource.type="gae_app" AND log_id="requests"
  • 配置重写规则,提取x-forwarded-for头的第一个IP替换httpRequest.remoteIp字段:
httpRequest.remoteIp = extract(httpRequest.requestHeaders['x-forwarded-for'], r'^([^,]+)')

配置完成后所有原生GAE请求日志会自动替换为真实用户IP,不需要修改任何业务代码,也不会生成重复日志。

方案3:优化现有日志上报逻辑,避免重复日志

如果暂时不想改基础设施配置,可修改现有代码去掉手动上报完整httpRequest的逻辑,只将真实IP作为自定义元数据关联到原生请求日志即可:

const forwardedForHeader = req.headers['x-forwarded-for']
const userIp = forwardedForHeader ? forwardedForHeader.split(',')[0] : req.ip
// 不需要监听res.finish手动上报请求日志,直接将用户IP存入日志元数据,和现有trace/span绑定即可
logger.info('request processed', {
  userIp: userIp,
  // 已经配置的LOGGING_TRACE_KEY和LOGGING_SPAN_KEY会自动关联到原生请求日志
})

这样不会生成重复的请求日志,真实IP会作为自定义字段和原生请求日志绑定,查询时可直接关联筛选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:36:06