Nginx动态代理后获取客户端ip

文章详细介绍了Nginx服务器配置中关于`proxy_set_header`指令的使用,特别是设置`X-Real-IP`和`X-Forwarded-For`头的重要性,以确保正确追踪客户端IP。同时,提到了gzip压缩的配置以及如何在Java代码中通过HttpServletRequest获取IP地址。配置示例涵盖了对/api/、/web-cus/及根路径的处理,强调了不同location块下的代理设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

nginx配置
注意:proxy_set_header X-Real-IP 和 proxy_set_header X-Forwarded-For不能缺

server {
    listen 80;
    server_name xxxx.com;
    # 开启gzip
    gzip on;
    # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
    gzip_types text/plain application/javascript text/css application/xml;
    # 是否在http header中添加Vary: Accept-Encoding,建议开启
    gzip_vary on;
    root tz-web/mall;


    location /api/ {
        proxy_set_header Host $proxy_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;

        proxy_pass http://gateway.xxx.com/;
    }

    location ^~ /web-cus {
        root tz-web/mall;
        index index.html;
        try_files $uri $uri/ /web-cus/index.html;

        # 增加不缓存index.html
        if ($request_filename ~* .*\.(?:htm|html)$) {
            add_header Cache-Control "no-cache";
        }
    }

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
        proxy_pass http://127.0.0.1:7202/;
    }

}

获取ip工具

/**
 * IP Utils
 *
 * @author wrx
 * @date 2023.02.17
 */
@Slf4j
public class IPUtils {

    /**
     * 请求头中的ip
     */
    private static final List<String> HEADER_LIST = CollUtil.newArrayList("X-Real-IP", "x-forwarded-for", "Proxy-Client-IP", "WL-Proxy-Client-IP"
            , "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR", "REMOTE_ADDR");

    /**
     * 获取IP地址
     * <p>
     * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
     * 目前测试发现仅X-Real-IP获取的ip最为准确,故放在最前面
     */
    public static String getIp(HttpServletRequest request) {
        for (String header : HEADER_LIST) {
            String ip = request.getHeader(header);
            if (StrUtil.isNotBlank(ip)) {
                log.info("获取的ip地址:{}", ip);
                return StrUtil.contains(ip, StrUtil.C_COMMA) ? ip.split(StrUtil.COMMA)[0] : ip;
            }
        }
        return StrUtil.EMPTY;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值