随笔 - 1357  文章 - 0  评论 - 1104  阅读 - 1941万

nginx反向代理如何获取真实IP?

由于客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址。

1、安装--with-http_realip_module
要想在程序中取得真实的IP,需对nginx重新编译,新增--with-http_realip_module选项,操作如下:

cd /home/xxx/dev/nginx-1.10.2/
./configure --with-http_realip_module
make
make install

#查看--with-http_realip_module是否安装成功

cd /usr/local/nginx/sbin
sudo ./nginx -V

注意:安装前nginx记得先关闭,安装完毕再重启。

2、相关配置

复制代码
location / {
    proxy_pass http://lotmall;
    proxy_buffering on;
     
    set_real_ip_from 192.168.1.118;  #指定接收来自哪个代理发送的IP head,可以是单个IP或者IP段
    real_ip_header X-Real-IP;
    
    proxy_connect_timeout       30;
    proxy_read_timeout          30;
    proxy_send_timeout          30;
}
复制代码

 

3、nginx打印用户真实IP

http {
    log_format  main  '$proxy_add_x_forwarded_for - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /usr/local/nginx/logs/access.log main;
}

 因为默认用的$remote_addr打印的是代理服务器的IP,我们不需要这个,所以我们使用代替了它的$http_x_forwarded_for 就可以打印出真实用户的IP了。

4、Java获取客户端真实IP方法

复制代码
    /**
     * 请求获取客户端的真实IP地址
     * 
     * @param request
     * @return
     * @author jqlin
     */
    public static String getRealIpAddress(HttpServletRequest request) {
        String ipAddress = request.getHeader("x-forwarded-for");
        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("Proxy-Client-IP");
        }
        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
            if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) {
                // 根据网卡取本机配置的IP
                try {
                    InetAddress inet = InetAddress.getLocalHost();
                    ipAddress = inet.getHostAddress();
                } catch (UnknownHostException e) {
                    log.error("根据网卡获取本机配置的IP异常", e);
                }
                
            }
        }
        
        // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
        if (ipAddress != null && ipAddress.indexOf(",") > 0) { // "***.***.***.***".length()
            ipAddress = ipAddress.split(",")[0];
        }
        
        return ipAddress;
    }
复制代码

 

posted on   Ruthless  阅读(3480)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示