next.js 下一步API ip地址返回服务器ip而不是客户端ip

7kqas0il  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(190)

我正在使用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。
为什么?!解决办法是什么?

omqzjyyz

omqzjyyz1#

from here
当客户端直接连接到服务器时,客户端的IP地址被发送到服务器(并且通常被写入服务器访问日志)。但是,如果客户端连接通过任何正向或反向代理,服务器只能看到最终代理的IP地址,这通常没有什么用处。如果最终代理是一个负载均衡器,它与服务器属于同一个安装,则情况尤其如此。
我认为问题在于要么你正在使用代理,要么vercel正在使用负载均衡器。NextRequest具有ip方法。尝试使用

const ip = req.ip ?? "127.0.0.1";

相关问题