【问题标题】:Next.js api route with IP address带有 IP 地址的 Next.js api 路由
【发布时间】:2021-07-24 01:31:51
【问题描述】:

在我的 next.js api 路由之一中,

例如:pages/api/example.js

我有以下简单的代码。 然后,在这条路线内,我向服务器发送请求。

export default async function example(req, res) {
   
  const data = await axios.post(
     https://another_server_Url, // another server api
    {
      data
    })

  res.status(200).json({ name: 'John Doe' })
}

我的问题是another_server api 是否实现了评级限制机制, 我可以先获取用户 IP 地址,然后通过 axios 请求以某种方式传递 IP 地址。这样another_server api就可以识别出真实的ip了。

据我了解当前代码,next.js 服务器不知何故变成了代理。

现在的问题是,因为我在下一个路由器 api 中调用了 Api,所以 ip 地址将始终是我的next.js 服务器。

【问题讨论】:

    标签: javascript node.js reactjs next.js


    【解决方案1】:

    您可以从req.headers['x-forwarded-for'] 获取客户端的 IP - 请查看:How to determine a user's IP address in node。然后,将此 IP 在 axios POST 请求正文中传递给another_server

    编辑:

    响应您在下面的评论,实现很大程度上取决于后端服务器 (another_server) 的配置以及它如何读取客户端 IP。例如,检查它是否使用请求标头来确定 IP - 如果是,则识别特定标头并在 axios 调用中覆盖它以包含原始客户端 IP,例如:

      const clientIp = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() || 
        req.socket.remoteAddress;
    
      const data = await axios({
        method: 'post',
        url: 'https://google.com',
        headers: {
          'x-forwarded-for': clientIp
        },
        // ...
      });
    

    另一种解决方案是简单地将请求从客户端直接发送到 another_server 并完全跳过该问题,但我认为在您的情况下这不是一个可行的解决方案。

    【讨论】:

    • 您的回答似乎完全合法。但它假设另一台服务器将在邮件正文中获取 ip,而不是从标题中获取。因此,这意味着另一台服务器需要根据传入的 ip 地址在速率限制中间件中以不同方式处理 ip(仅当标头中的 ip 来自 next.js ip 时才获取 ip 字段),以防某些恶意帖子滥用ip 字段在某些时候,但我们不会拿起它。也许这是唯一艰难的路要走。我的问题设计得很糟糕,因为它隐藏了我想要解决的真正问题。
    猜你喜欢
    • 1970-01-01
    • 2020-09-08
    • 2020-08-12
    • 1970-01-01
    • 2017-10-19
    • 2020-05-06
    • 2010-10-06
    • 2021-02-25
    • 1970-01-01
    相关资源
    最近更新 更多