现在有一个需求 想拿到用户的请求(如 80 443 端口的 http 请求) 进行过滤 通过的就转发到本地的站点端口 不通过的就直接返回 404 或者重定向到其他的地址
但是不知道该怎么写 求大佬指点一下思路 或者应该了解那些知识点呢 这是我做的思维导图 。。。
1
yuikns 2020-07-13 12:33:48 +08:00
你这个需求不明确
golang 自带 http server 库,也可以用 gin 等。如果是做个 client 转发,如果不是自定义 404/301 。 问题在哪? |
2
sirgod 2020-07-13 12:34:25 +08:00
你用 go 写过 http 服务吗?
|
3
chaodada OP @sirgod #2 之前做过,但是用 nginx 转发到 golang 这个,我是想让请求都经过 golang 进行处理,然后转发到 nginx 或者其他服务
|
4
yrj 2020-07-13 12:46:39 +08:00 via iPad
你提问的就是流程(思路)。如果你还不知道,那应该从基础学一下
|
5
wangritian 2020-07-13 12:48:32 +08:00
需求拆开看,分 3 个部分,http 服务器,http 请求,过滤器,你说的拿到 80 443 端口的请求,其实就是个 http 服务器,拿到参数后走个过滤程序,通过后,uri 和参数不变,向业务服务器发请求,把结果返回给用户
|
6
yuikns 2020-07-13 12:51:40 +08:00
https://medium.com/@mlowicki/http-s-proxy-in-golang-in-less-than-100-lines-of-code-6a51c2f2c38c
参考这个。 你可以在 http.HandlerFunc 对 *http.Request 加个过滤。 不过强烈建议稍微了解下基础概念 |
7
yuikns 2020-07-13 12:53:24 +08:00
另外,直接 golang 处理 https 可能不是一个很好的主意(当然这是可行的),因为这个证书管理可能会遇到点麻烦。你可以用 nginx 或者各种 slb 等代理一层,go 需要过滤处理 http 完事
|
8
reus 2020-07-13 13:47:11 +08:00 via Android
会也不教你
|
9
brader 2020-07-13 14:28:58 +08:00
你这个需求,更像做一个代理服务器,思路很简单,你先用 go 做成功一个代理功能,第一步什么也不要想,别去想什么过滤功能,你只要实现代理就好了,就想左手拿到数据,交给右手这样简单。
实现了第一步代理功能,第二步,就是 go 解析客户端的请求内容,做特征识别过滤,到这里你的需求就完成了。 |
10
chaodada OP |
11
eudore 2020-07-13 16:09:31 +08:00 1
没啥难点 大概写下伪代码 题主自己调试下
func main() { // 配置下反向代理地址 proxyer := httputil.NewSingleHostReverseProxy(....) // demo 监听一个地址 http.ServeAndListen(":8080", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request){ // 在此过滤逻辑 if req.Path == "/" { rw.WriteHeader(404) return } // 反向代理转发 proxyer.ServeHTTP(rw,req) })) } |
12
wangyzj 2020-07-13 16:43:51 +08:00
过滤条件复杂就用 go 自带的 http server 处理
不负责 nginx 就行了 |
13
sirgod 2020-07-13 17:57:07 +08:00
@chaodada 既然写过,那这个需求并不比通常的 http 服务更复杂,只不过监听了两个端口,443 端口需要指定证书和 key 的文件路径,不知道你的困难点在哪?是不知道怎么监听两个端口还是不知道怎么做反向代理还是别的?
|
15
chaodada OP 谢谢大家
|