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

鹅厂二面,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. ELK技术-IK-中文分词器

    1.背景 1.1 简介 ES默认的分词器对中文分词并不友好,所以一般会安装中文分词插件,以便能更好的支持中文分词检索. 本例参考文档:<一文教你掌握IK中文分词> 1.2 IK分词器 IK ...

  2. openstack 搭建详细步骤

    该博文转载于(https://www.cnblogs.com/whwh/p/16200004.html) 一.openstack单点部署 1.配置虚拟机NAT网络连接 查看vmware的NAT网络默认 ...

  3. day31-线程基础01

    线程基础01 1.程序 进程 线程 程序(program):是为完成的特定任务,用某种语言编写的一组指令的集合.简单来说,就是我们写的代码. 进程: 进程是指运行中的程序,比如我们使用QQ,就启动了一 ...

  4. 选择排序C语言版本

    算法思路,从头至尾扫描序列. 首先从第二个到最后,找出最小的一个元素,和第一个元素交换: 接着从第三个到最后,后面找出最小的一个元素,和第二个元素交换: 依次类推最终得到一个有序序列. void Se ...

  5. Java 流处理之收集器

    Java 流(Stream)处理操作完成之后,我们可以收集这个流中的元素,使之汇聚成一个最终结果.这个结果可以是一个对象,也可以是一个集合,甚至可以是一个基本类型数据. 以记录 Record 为例: ...

  6. flutter系列之:flutter中常用的ListView layout详解

    目录 简介 ListView详解 ListView中的特有属性 ListView的构造函数 ListView的使用 总结 简介 ListView是包含多个child组件的widget,在ListVie ...

  7. Windows SMTP服务器的中继列表

    今天在一台Windows 2019的SMTP服务器上想增加一个匿名中继的客户端地址.登录到服务器后发现原来的设置丢失了,而且原来的允许列表也不见了.界面变成了这样. https://www.cnblo ...

  8. MySQL常用函数整理,建议收藏!

    常见函数 字符串函数 数字函数 日期函数 聚合函数 流程控制函数 一.字符串函数 concat(s1,s2...,sn) --将s1,s2...,sn连接成字符串,如果该函数中的任何参数为 null, ...

  9. k8s pod被驱逐问题分析及解决

  10. git pull提示如下信息时候的操作

    执行git pull时提示信息如下: There is no tracking information for the current branch. Please specify which bra ...