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_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。

时间: 2024-10-15 23:26:15

Nginx学习笔记09控制转发的信息的相关文章

《机电传动控制》学习笔记09

<机电传动控制>学习笔记09 胡恒谦 机卓1301 1. 电力电子器件 电力电子器件根据其导通和关断可控性的不同可以分为以下三类. (1)不可控型器件,即导通与关断都不能控制的器件.仅整流二极管是不可控器件. (2)半控型器件,即只能控制其导通,不能控制其关断的器件.普通晶闸管SCR及其派生器件属于半控型器件. (3)全控型器件,即导通与关断都可以控制的器件.GTR.GTO.IGBT等都属于全控型器件. 2. 晶闸管 晶闸管导通条件为:加正向电压且门极有触发电流:其派生器件有:快速晶闸管,双向

STM8S学习笔记-时钟控制1

1.图13可见,STM8S单片机主要有四种时钟源可供选择: 1).1-24MHz外部晶体振荡器(HSE). 2).最大24MHz外部时钟(HSE ext). 3).16MHz高速内部RC振荡器(HSI). 4).128KHz低速内部RC振荡器(LSI). 2.主时钟可以从这四种时钟源中任意切换,切换过程可通过自动切换和手动切换. 自动切换过程: CLK_SWCR |= 0x20;    //使能切换 CLK_SWR = 0xE1; //  (HSI----复位值) // (0xD2 ----LS

C++ GUI Qt4学习笔记09

C++ GUI Qt4学习笔记09 qtc++ 本章介绍Qt中的拖放 拖放是一个应用程序内或者多个应用程序之间传递信息的一种直观的现代操作方式.除了剪贴板提供支持外,通常它还提供数据移动和复制的功能. QMimeData是一个可以提供不同格式数据的类. 9.1使拖放生效 拖放操作有两个动作:拖动和放下.Qt窗口部件可以作为拖动点.放下点或者同时作为拖动点和放下点. 9.2支持自定义拖动类型 9.3剪贴板处理技术 多数应用程序都通过某一种或者几种方式来使用Qt的内置剪贴板处理技术. C++ GUI

STM8S学习笔记-时钟控制2

今天把时钟系统的最后部分,时钟安全系统(CSS)和时钟输出功能(CCO),做一个简答的说明. 1.时钟安全系统(以下简称CSS) CSS功能很简单,就是监控HSE是否实效(如果系统使用HSE作为主时钟源),而自动切换到HSI/8作为主时钟源,从而避免系统停止运行. 如果使能CSSIEN,当主时钟失效,切换到HSI/8后可产生一个中断,这时可以改变HSI的分频,从而系统继续正常工作. 如果系统主时钟源不是HSE,则不用关心CSS. 2.时钟输出功能(以下简称CCO) CCO是MCU向外提供系统时钟

nginx学习笔记之基于端口的虚拟主机基于主机名的虚拟主机root、alias、index配置

nginx学习笔记之基于端口的虚拟主机基于主机名的虚拟主机root.alias.index配置 实验环境: centos 测试节点IP:172.16.3.101 基于端口的虚拟主机: vim /etc/nginx/nginx.conf # 向里面的http {}里面加入如下内容   server { # server定义一个虚拟主机         listen 8080; # 监听本机所有IP端口8080         server_name www.test.com; # 虚拟主机名为:w

【视频编解码&#183;学习笔记】11. 提取SPS信息程序

一.准备工作: 回到之前SimpleH264Analyzer程序,找到SPS信息,并对其做解析 调整项目目录结构: 修改Global.h文件中代码,添加新数据类型UINT16,之前编写的工程中,UINT8和UINT32都为小写表示,为了更符合编程规范,将其改为全大写(可使用ctrl+H在整个解决方案内进行替换). typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned int UINT32; 之后编

CSS学习笔记09 简单理解BFC

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>BFC</title> 6 <style type="text/css"> 7 .div1 {background-color: #FCE38A; width: 200px; height: 100px;}

Nginx学习笔记——搭建Linux +Nginx+PHP+Mariadb(MySql)开发环境

1.安装Nginx 源安装 本人安装环境是Deepin(Ubuntu的衍生版),所以最简单的方法就是执行 sudo apt-get install nginx 或者CentOS下: yum install nginx 编译安装 http://nginx.org/ 下载最新版1.9.5,支持HTTP/2模块,号称更快更安全,并且可以向下兼容,具体细节查看NGINX_HTTP2_White_Paper_v4.pdf 依赖关系:openssl-1.0.0s,pcre-8.36,zlib-1.2.8 分

Nginx学习笔记二基本配置

1.Nginx的配置文件默认在Nginx程序安装目录的conf二级目录下,主配置文件为nginx.conf.假设您的Nginx安装 在/usr/local/webserver/nginx/目录下,那么默认的主配置文件则为/usr/local/webserver/nginx/nginx.conf.2.Nginx配置参数:(1)user www www 指定使用的用户和用户所在的组(2)worker_processes 8 指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍,如两个四核CPU,