文章目录
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;
}
}