Reverse Proxy用途:
1,隐藏源服务器的存在和特点;
2,应用防火墙的特点,可以保护不受 web-based 攻击;
3,相当于SSL 加速硬件;
4,分配incoming request给不同的 server,每一个server都有他们自己的应用领域。在这种情况下,reverse proxy要重写URL以便使request可以访问到 requested resource location
5,通过caching static content/ dynamic content,以减少源服务器的 load。这被称作 web acceleration。
6,通过压缩来优化content,从而加速 loading time
7,动态生成的 page只需要生成1次,然后通过 reverse proxy 发给client。这样产生那个page的程序就不用保持open,从而解放了服务器的资源(在client 请求的可能的时间内)
8,reverse proxy 可以在任何多个服务器需要被同一个IP同时访问的时候操作。这些 web servers监听不同的端口with one IP,或者different machine ,different IP in the local network. reverse proxy 分析收到的request,分发给内网对应的 web servers
9,能够实施 A/B 测试,或者 多变量测试,不用 设置 js tags或者在pages中code
10,逆向代理服务器也被用于 search engine marketing,通过tracking code自动instrument a destination website。可用于竞争排名优化等等。
https://blog.csdn.net/aFeiOnePiece/article/details/45170941
https://blog.csdn.net/qq_38900565/article/details/107584279
X-Forwarded-For 头部格式也比较简单,比如某个服务器接受到请求的对应头部可能是:
对应的值有多个字段,每个字段代表中间的一个节点,它们之间由逗号和空格隔开,从左到右距离当前节点越来越近。
每个代理服务器会在 X-Forwarded-For 头部填上前一个节点的 ip 地址,这个地址可以通过 TCP 请求的 remote address 获取。为什么每个代理服务器不填写自己的 ip 地址呢?有两个原因,如果由代理服务器填写自己的 ip 地址,那么代理可以很简单地伪造这个地址,而上一个节点的 remote address 是根据 TCP 连接获取的(如果不建立正确的 TCP 连接是无法进行 HTTP 通信的);另外一个原因是如果由当前节点填写 X-Forwarded-For ,那么很多情况客户端无法判断自己是否会通过代理的。
NOTE:
最终客户端或者服务器端接受的请求, X-Forwarded-For 是没有最邻近节点的 ip 地址的,而这个地址可以通过 remote address 获取
每个节点(不管是客户端、代理服务器、真实服务器)都可以随便更改 X-Forwarded-For 的值,因此这个字段只能作为参考
代理接收到客户端的请求,复制了原来的请求对象,并根据数据配置新请求的各种参数(添加上 X-Forward-For 头部等)
把新请求发送到服务器端,并接收到服务器端返回的响应
代理服务器对响应做一些处理,然后返回给客户端
Golang 已经给我们提供了编写代理的框架: httputil.ReverseProxy 。我们可以用非常简短的代码来实现自己的代理,而且内部的细节问题都已经被很好地处理了。
https://blog.csdn.net/mengxinghuiku/article/details/65448600
在ServeHTTP中并没有做其他多余操作,只是调用了r.ParseForm()进行Form解析,坑就在这里。
由于r.Body是一个接口io.ReadCloser,ParseForm中对reader进行了ioutil.ReadAll(reader),而ioutil.ReadAll中对Buffer进行了清空重用。
去掉r.ParseForm()就可以了。
https://www.cnblogs.com/cqvoip/p/8078816.html