我正在使用Next js应用程序,我试图获取客户端用户的IP地址和地理位置,但我得到了我部署的vercel
服务器的ID地址。
我试过middleware
:
import { NextFetchEvent, NextRequest, NextResponse } from 'next/server';
export async function middleware(request: NextRequest, _next: NextFetchEvent) {
const { nextUrl: url, geo } = request
const country = geo?.country
// Clone the request headers and set a new header `x-hello-from-middleware1`
const requestHeaders = new Headers(request.headers)
requestHeaders.set('country', country||'EG')
// You can also set request headers in NextResponse.rewrite
const response = NextResponse.next({
request: {
// New request headers
headers: requestHeaders,
},
})
return response
}
然后,当从api
目录中的header使用country
时:
export default async (req:MyRequest, res:NextApiResponse) => {
if (req.method === 'GET') {
const country= req.headers.country;
}
}
我找到服务器的国家了!!
我也试过:
export default async (req:MyRequest, res:NextApiResponse) => {
if (req.method === 'GET') {
const forwarded = req.headers['x-forwarded-for'];
const ip = typeof forwarded === 'string' ? forwarded.split(/, /)[0] : req.socket.remoteAddress;
}
}
但结果是一样的!主机服务器的IP。
为什么?!解决办法是什么?
1条答案
按热度按时间omqzjyyz1#
from here
当客户端直接连接到服务器时,客户端的IP地址被发送到服务器(并且通常被写入服务器访问日志)。但是,如果客户端连接通过任何正向或反向代理,服务器只能看到最终代理的IP地址,这通常没有什么用处。如果最终代理是一个负载均衡器,它与服务器属于同一个安装,则情况尤其如此。
我认为问题在于要么你正在使用代理,要么vercel正在使用负载均衡器。
NextRequest
具有ip
方法。尝试使用