先重温一下什么叫反向代理,正向代理。

鹅厂二面,nginx回忆录

所谓正向,反向代理取决于代理的是出站请求,还是入站请求

正向代理: 代理的出站请求, 客户端能感知到代理程序,架构上距离客户端更近。

反向代理: 代理的是入站请求,客户端认为代理程序就是服务器,客户端感知不到代理逻辑,架构上距离服务端更近。


前几天利用golang实现了反向代理程序,引出了Host请求头在反代中的关键作用。

对于proxy.com的请求,都被透明无感代理到A.com

package main

import (
"fmt"
"log"
"net/http"
"net/http/httputil"
) func ReverseProxyHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("receive a request from:", r.RemoteAddr, r.Header) target := "www.baidu.com"
director := func(req *http.Request) {
req.URL.Scheme = "https"
req.URL.Host = target
req.Host = target
}
proxy := &httputil.ReverseProxy{Director: director}
proxy.ServeHTTP(w, r)
} func main() {
fmt.Printf("Starting server at port 8080\n")
if err := http.ListenAndServe(":8080", http.HandlerFunc(ReverseProxyHandler)); err != nil {
log.Fatal(err)
}
}

这几天刚好遇到了一个正常代理的case, 简单记录一下。

package main

import (
"fmt"
"log"
"net/http"
"net/http/httputil"
) func ProxyHandler(w http.ResponseWriter, r *http.Request) {
fmt.Printf("receive a request from {0} {1}: \n", r.RemoteAddr, r.Header)
if r.Host != "localhost:8080" {
director := func(req *http.Request) {
req.URL.Scheme = "http"
req.URL.Host = r.Host
req.Host = r.Host
}
proxy := &httputil.ReverseProxy{Director: director}
proxy.ServeHTTP(w, r)
} else {
http.NotFound(w, r)
}
} func main() {
if err := http.ListenAndServe(":8080", http.HandlerFunc(ProxyHandler)); err != nil {
log.Fatal(err)
}
}

其中要注意的就是,正向代理式要规避死循环代理。

使用该服务作为代理程序,将可以出站访问任何地址。

使用时,针对httpclient设置proxy

//adding the proxy settings to the Transport object
transport := &http.Transport{
Proxy: http.ProxyURL(proxyURL),
} //adding the Transport object to the http Client
client := &http.Client{
Transport: transport,
}

下面使用curl指令演示(-x 后接代理地址)

curl -x 127.0.0.1:8080 www.baidu.com

GO快闪#

本文总结了go语言正反向代理的姿势。

Go语言正/反向代理的姿势的更多相关文章

  1. GO语言一行代码实现反向代理

    本文,介绍了什么是反向代理,如何用go语言实现反向代理. 至于他的标题, "GO语言一行代码实现反向代理 | Writing a Reverse Proxy in just one line ...

  2. Go 语言实现 HTTP 层面的反向代理

    最近对 Go 语言的反向代理使用得偏多,其实在大概两年前就写过 TCP 层面的代理,而且那时也是用的 Go 语言,不同之处在于之前只是偶尔尝试一下使用,最近是因为工作需要使用的.相比较于 TCP 层面 ...

  3. Nginx-正反向代理及负载均衡

    目录 正/反向代理 代理的方式 Nginx代理服务支持的协议 代理实战 部署web01 部署Lb01 Nginx代理常用参数 添加发往后端服务器的请求头信息 代理到后端的TCP连接.响应.返回等超时时 ...

  4. 使用go语言实现简单的反向代理工具激活IntelliJ和PyCharm,持续更新

    最近Jetbrians系列IDE更新至2017.3版本,激活检测机制也变成了动态封禁域名,导致大部分域名激活被屏蔽了,所以找了下资料,根据ilanyu的代码,改了下地址,实现了本地反向代理激活服务器. ...

  5. upstream模块实现反向代理的功能

    nginx平台初探(100%) — Nginx开发从入门到精通 http://tengine.taobao.org/book/chapter_02.html#id6 nginx的模块化体系结构¶ ng ...

  6. nginx反向代理、负载均衡以及分布式下的session保持

    [前言]部署服务器用到了nginx,相比较于apache并发能力更强,优点也比其多得多.虽然我的项目可能用不到这么多性能,还是部署一个流行的服务器吧! 此篇博文主要学习nginx(ingine x)的 ...

  7. nginx是一个反向代理的软件

    nginx只是一个反向代理的软件,和语言无关,理论上支持任何Web平台,当然http://Asp.net也不例外,http://51aspx.com就是http://Asp.net开发的,前端暴漏的是 ...

  8. NGINX反向代理

                                                    Nginx反向代理                                           ...

  9. 反向代理代理百度、google

    <VirtualHost _default_:443> # ServerAdmin mail@localhost # DocumentRoot "/var/www/html&qu ...

随机推荐

  1. 「JOI 2015 Final」分蛋糕 2

    「JOI 2015 Final」分蛋糕 2 题解 这道题让我想起了新年趣事之红包这道DP题,这道题和那道题推出来之后的做法是一样的. 我们可以定义dp[i][len][1] 表示从第i块逆时针数len ...

  2. Docker网络讲解 及实验redis集群部署

    理解docker0 准备工作:清空所有的容器,清空所有的镜像 docker rm -f $(docker ps -a -q) # 删除所有容器 docker rmi -f $(docker image ...

  3. KingbaseES V8R3 由于修改系统时间导致sys_rman备份故障案例

    ​ 案例说明: 此案例,为复现"current time may be rewound"错误.对于数据库环境,在使用前必须保证系统时间的正确性.如果数据库创建后,再将系统时间修改为 ...

  4. Qt5.14.2使用虚拟键盘

    说明 这是关于Qt5(Qt5.1.4.2),QWidget编程使用Qt虚拟键盘(qtvirtualkeyboard) Tag: QT5,Qt,软件盘.虚拟键盘,Widget程序,QML  作者:474 ...

  5. DFS文件夹无法访问

    最近DFS的文件服务器出现了部分文件和文件夹无法访问的情况.客户端直接访问DFS成员的共享文件夹时有是会出现Element not found的错误.有时打开文件的时候会出现文件不存在,或者你没有权限 ...

  6. SonarQube支持Gitlab授权登录

    部署好SonarQube之后,由于我们内部使用的是自建的Gitlab仓库,即每个开发同学都有Gitlab账号,SonarQube我们就可以使用上Gitlab登录,这样就不需要再维护一套用户体系了. S ...

  7. Dockerfile文件中的ENTRYPOINT,CMD命令跟k8s中command,args之间的关系

  8. Elasticsearch基础但非常有用的功能之一:别名

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484454&idx=1&sn=43e95a2 ...

  9. C++ 自学笔记 访问限制 Setting limits

    Setting limits 让客户不能改,让设计者可以改 C++: 任何人访问 成员函数访问(同一个类的不同实例化对象可以相互访问私有成员变量) 类自己或子类访问 friend: 朋友就可以授权访问 ...

  10. 部署 LNMP(源码安装版本)shell脚本

    #!/bin/bash # 一键部署 LNMP(源码安装版本) menu() { clear echo " ##############‐‐‐‐Menu‐‐‐‐##############& ...