nginx如何获取用户真实ip

2024-08-27 14:05:51 1569

蓝队云小课堂:
Nginx 中获取客户端的真实 IP 地址有时会比较复杂,特别是当你使用了负载均衡器、代理服务器或者 CDN 服务时。这些中间层可能会修改请求头,导致 Nginx 接收到的 IP 地址并不是客户端的真实 IP 地址。

为了确保能够获取到真实的客户端 IP 地址,你可以通过以下几种方式来实现:

 

1. 使用 real_ip 模块和 set_real_ip_from 指令

Nginx 支持一个叫做 real_ip 的模块,它可以通过 HTTP 请求头来确定客户端的真实 IP 地址。你可以通过 set_real_ip_from 指令来配置哪些 IP 地址范围发送的 X-Real-IP 或者 X-Forwarded-For 头是可信的。

 

示例配置:
http {

    # 开启 real_ip 模块

    real_ip_header X-Real-IP;

    real_ip_recursive on;

 

    server {

        listen 80;

        server_name example.com;

 

        # 设置哪些 IP 地址的 X-Real-IP/X-Forwarded-For 是可信的

        set_real_ip_from 10.0.0.1;

        set_real_ip_from 192.168.0.1/16;

 

        location / {

            proxy_pass http://www.landui.com_server;

 

            # 使用 $remote_addr 变量来获取客户端的真实 IP 地址

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }

    }

}


2. 使用 proxy_set_header 指令

即使不使用 real_ip 模块,你也可以通过 proxy_set_header 指令来传递客户端的真实 IP 地址给后端服务器。这通常用于确保后端应用程序也能访问到客户端的真实 IP 地址。

 

示例配置:
server {

    listen 80;

    server_name example.com;

 

    location / {

        proxy_pass http://www.landui.com_server;

 

        # 设置 X-Real-IP 和 X-Forwarded-For 头部

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}


3. 使用 proxy_set_header 并添加 X-Forwarded-For

如果你的应用程序期望 X-Forwarded-For 头中包含所有代理服务器的 IP 地址,你可以通过 proxy_set_header 添加这个头部,并使用 proxy_add_x_forwarded_for 来追加代理服务器的 IP 地址。

 

示例配置:

server {

    listen 80;

    server_name example.com;

 

    location / {

        proxy_pass http://www.landui.com_server;

 

        # 添加 X-Forwarded-For 头,并追加代理服务器的 IP 地址

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}

 

注意事项:

如果你的 Nginx 配置中有多个代理层,确保每个代理层都正确地设置了 X-Forwarded-For 头。

当使用 set_real_ip_from 指令时,要确保只信任那些可信的代理服务器的 IP 地址,以避免中间人攻击。

更多小知识,可联系蓝队云一起探讨。

提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: