当直接代理到tomcat服务的时候,会将客户发送过来的原始ip给覆盖了,所以我们需要通过
proxy_set_header
来设定原始ip,proxy_set_header X-real-ip $remote_addr;
指定ip地址为‘X-real-ip’字段,然后通过request.getHeader(“X-real-ip”) 来获取。
反向代理
当直接代理到tomcat服务的时候,会将客户发送过来的原始ip给覆盖了,所以我们需要通过proxy_set_header
来设定原始ip。
server {
#监听端口
listen 81;
#服务名称
server_name localhost;
#匹配路径,这个地方支持正则表达式
location / {
#X-real-ip 是http协议表头的一个字段,可以定义成任何ip,然后在服务端,通过request.getHeader("X-real-ip") 来获取
#设定代理的时候,http协议ip地址保持,不然就都变成代理的ip地址了
proxy_set_header X-real-ip $remote_addr;
#反向代理到本机8080端口
proxy_pass http://127.0.0.1:8080;
}
#日志文件
access_log logs/demo_access.log main;
}
测试jsp
<!DOCTYPE html>
<%@ page session="false" %>
<html lang="en">
<head>
<title><%=request.getServletContext().getServerInfo() %></title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Hello demo</h1>
<!--获取代理传递过来的ip-->
<p>X-real-ip<%=request.getHeader("X-real-ip")%></p>
<!--获取远程ip地址,如果是代理服务进,只能获取代理服务器ip了-->
<p>remoteAddr <%=request.getRemoteAddr()%></p>
</body>
</html>
直接访问结果
当直接访问的时候,远程获取的ip地址是没问题的,但是代理ip没有,这是因为我们没有设定,所以没有也正常。
代理访问结果
代理地址访问,通过request.getRemoteAddr()
获取ip的方式失败,但是通过nginx设定的http的表头数据没有问题,获取真实ip成功