Nginx学习笔记09控制转发的信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx学习笔记09控制转发的信息相关的知识,希望对你有一定的参考价值。

在使用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_HOSTREMOTE_ADDRNginx的地址,而不是用户的真实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-IPX-FORWARDED-FOR,并通过$remote_addr$proxy_add_x_forwarded_for变量将Nginx检测到的用户IP加入到了HTTP头信息中。因此Tomcat中的JSP应用可通过X-REAL-IPX-Forwarded-For获取到用户IP。此时JSP应用通过request.getRemoteHost()request.getRemoteAddr()获取到的IP仍然是Nginx主机的IP

 

以上是关于Nginx学习笔记09控制转发的信息的主要内容,如果未能解决你的问题,请参考以下文章

Nginx学习笔记之加强篇

Nginx学习笔记

Nginx,LNMP学习笔记

Nginx,LNMP学习笔记

Ocelot学习笔记

SpringMVC学习笔记