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

NextRequest在Google Cloud Run中获取客户端IP及geo.city失败

解决Google Cloud Run上Next.js Middleware无法获取客户端IP和geo.city的问题

1. 配置获取客户端真实IP

Cloud Run默认会通过X-Forwarded-For请求头传递客户端真实IP,但Next.js的NextRequest不会自动解析该头填充ip属性,需要手动处理:

  • 首先在项目根目录的next.config.js中开启代理信任:
/** @type {import('next').NextConfig} */
const nextConfig = {
  serverRuntimeConfig: {
    trustProxy: true,
  },
  trustHostHeader: true,
};

module.exports = nextConfig;
  • 然后在Middleware里从X-Forwarded-For头提取真实IP(该头第一个值即为客户端IP):
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
  const clientIp = request.headers.get('x-forwarded-for')?.split(',')[0].trim();
  // 此时clientIp即为客户端真实IP,可替代原request.ip使用
  
  // 后续业务逻辑
  return NextResponse.next();
}

2. 处理geo.city获取问题

Cloud Run本身不会像Vercel那样自动提供地理信息(如geo.city),需要自行实现:

  • 方案一:拿到上述提取的客户端IP后,调用第三方IP地理定位服务(如MaxMind GeoIP2等),通过API获取城市信息。
  • 方案二:如果使用Cloud Load Balancer前置Cloud Run,可配置负载均衡器添加X-Geo-City这类自定义头,直接在Middleware中读取该头的值。

3. Cloud Run服务的必要检查

确保Cloud Run服务的Ingress设置为「允许所有流量」(默认配置即为该值,若修改过需重置),否则无法接收外部客户端的请求头;如果使用了Cloud CDN前置,需确认CDN配置中已开启传递X-Forwarded-For头到后端Cloud Run服务。


内容的提问来源于stack exchange,提问作者José Luis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:34:55