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

