在使用proxy_pass配置项时,可以使用以下配置来控制转发给后端主机的HTTP头信息。
(1)proxy_pass_header
向后端主机转发客户端请求中的HTTP头部。
(2)proxy_hide_header
向后端主机隐藏客户端请求中的HTTP头部。
(3)proxy_set_header
向后端主机发送额外的HTTP头部,可以新增HTTP头部,或者修改已有的HTTP头部。
不使用proxy_xxx_header进行HTTP头部信息控制的情况:
Nginx配置:
location ~ ^/hello/ {
proxy_pass http://tomcat101.coe2coe.me:8080;
}
jsp页面:
<table border="1" >
<tr><td>Name</td><td>Value</td></tr>
<%
Enumeration em = request.getHeaderNames();
while( em.hasMoreElements())
{
String name = (String)em.nextElement();
String value = request.getHeader(name);
%>
<tr><td><%=name%></td><td><%=value%></td></tr>
<%
}
%>
</table>
jsp页面输出:
Name |
Value |
host |
tomcat101.coe2coe.me:8080 |
connection |
close |
cache-control |
max-age=0 |
upgrade-insecure-requests |
1 |
user-agent |
Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36 |
accept |
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 |
dnt |
1 |
accept-encoding |
gzip, deflate |
accept-language |
zh-CN,zh;q=0.8,en;q=0.6 |
cookie |
JSESSIONID=5B5E1356F9DFFC1DAF2EFF38D2EF0D23 |
其它信息:
String REMOTE_HOST = request.getRemoteHost();
String REMOTE_ADDR = request.getRemoteAddr();
String X_FORWARDED_FOR = request.getHeader("X-Forwarded-For");
REMOTE_HOST 192.168.197.101
REMOTE_ADDR 192.168.197.101
X_FORWARDED_FOR null
由此可见,在没有使用proxy_set_header配置项的情况下,由于浏览器的请求经过Nginx的中转之后才到达Tomcat主机,因此JSP页面中获取到的REMOTE_HOST和REMOTE_ADDR是Nginx的地址,而不是用户的真实IP地址。另外,本次试验基于局域网进行,在浏览器和Nginx之间并未经过类似squid的其它代理服务器,因此HTTP头信息中不包含X-Forwarded-For。此时,Tomcat主机中的JSP应用无法获取到用户IP。
使用proxy_xxx_header的情况:
Nginx配置:
location ~ ^/hello/ {
proxy_pass http://tomcat101.coe2coe.me:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
页面输出:
Name |
Value |
x-real-ip |
20.1.1.11 |
x-forwarded-for |
20.1.1.11 |
host |
tomcat101.coe2coe.me:8080 |
connection |
close |
cache-control |
max-age=0 |
upgrade-insecure-requests |
1 |
user-agent |
Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36 |
accept |
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 |
dnt |
1 |
accept-encoding |
gzip, deflate |
accept-language |
zh-CN,zh;q=0.8,en;q=0.6 |
cookie |
JSESSIONID=5B5E1356F9DFFC1DAF2EFF38D2EF0D23 |
其它信息:
REMOTE_HOST 192.168.197.101
REMOTE_ADDR 192.168.197.101
X_FORWARDED_FOR 20.1.1.11
在使用proxy_xxx_header配置项后,加入了两个HTTP头信息:X-REAL-IP和X-FORWARDED-FOR,并通过$remote_addr和$proxy_add_x_forwarded_for变量将Nginx检测到的用户IP加入到了HTTP头信息中。因此Tomcat中的JSP应用可通过X-REAL-IP和X-Forwarded-For获取到用户IP。此时JSP应用通过request.getRemoteHost()和request.getRemoteAddr()获取到的IP仍然是Nginx主机的IP。