Nodejs iisnode 如何获取客户端ip

Nodejs iisnode 如何获取客户端ip

有大神知道通过iisnode 托管node后如何获取客户端ip的吗,node本身是可以获取了,但是托管以后就不知道怎么获取了。

3 回复

当然可以。当使用 iisnode 将 Node.js 应用程序部署到 IIS 服务器时,可以通过一些特定的方法来获取客户端的 IP 地址。以下是一个简单的示例代码,解释如何在 Node.js 应用程序中通过 iisnode 获取客户端的 IP 地址。

示例代码

const express = require('express');
const app = express();

app.use((req, res, next) => {
    // 获取客户端 IP 地址
    let clientIp = req.headers['x-forwarded-for'] || 
        req.connection.remoteAddress || 
        req.socket.remoteAddress ||
        req.connection.socket.remoteAddress;
    
    console.log(`Client IP: ${clientIp}`);
    
    // 如果需要,可以将客户端 IP 地址添加到请求对象中
    req.clientIp = clientIp;

    next();
});

app.get('/', (req, res) => {
    res.send(`Hello! Your IP is ${req.clientIp}`);
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

解释

  1. 中间件:我们创建了一个中间件函数来处理每个请求,并从中提取客户端的 IP 地址。

  2. 获取客户端 IP 地址

    • req.headers['x-forwarded-for']:这是最常用的方式,用于获取经过多个代理服务器后的原始客户端 IP 地址。IIS 会将客户端的 IP 地址添加到这个头部。
    • req.connection.remoteAddressreq.socket.remoteAddress:直接从连接或套接字中获取客户端的 IP 地址。这种方式适用于没有代理的情况。
    • req.connection.socket.remoteAddress:这是另一种方式,通常与前两种方式结合使用以确保兼容性。
  3. 设置请求对象:我们将获取到的客户端 IP 地址存储在 req.clientIp 中,以便后续处理中可以轻松访问。

  4. 路由处理:在根路径上,我们简单地返回客户端的 IP 地址信息。

  5. 启动服务器:最后,我们启动服务器并监听指定端口。

这样,无论是在开发环境中还是通过 iisnode 部署到 IIS 上,都可以正确地获取到客户端的 IP 地址。


在使用 iisnode 托管 Node.js 应用时,可以通过 req.headers['x-forwarded-for'] 来获取客户端的真实 IP 地址。由于 IIS 作为反向代理服务器,直接获取到的是 IIS 的 IP 地址,而不是客户端的 IP 地址。

以下是一个简单的示例代码来展示如何获取客户端的 IP 地址:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    let clientIp;
    
    // 获取客户端IP地址
    if (req.headers['x-forwarded-for']) {
        clientIp = req.headers['x-forwarded-for'].split(',')[0];
    } else {
        clientIp = req.connection.remoteAddress;
    }

    res.send(`Client IP: ${clientIp}`);
});

const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

解释:

  1. 检查 x-forwarded-for

    • req.headers['x-forwarded-for'] 包含一个由逗号分隔的 IP 地址列表,第一个 IP 地址通常是客户端的真实 IP 地址。
  2. 处理 x-forwarded-for 不存在的情况

    • 如果请求头中没有 x-forwarded-for,则可以使用 req.connection.remoteAddress 获取连接的远程 IP 地址(即 IIS 的 IP 地址)。

这段代码假设你的应用使用 Express 框架。如果你的应用没有使用任何框架,也可以根据 HTTP 请求对象来实现相同的功能。希望这能解决你的问题。

回到顶部