golang 小白求大佬指教

2020-07-13 12:21:15 +08:00
chaodada  chaodada

现在有一个需求 想拿到用户的请求(如 80 443 端口的 http 请求) 进行过滤 通过的就转发到本地的站点端口 不通过的就直接返回 404 或者重定向到其他的地址

但是不知道该怎么写 求大佬指点一下思路 或者应该了解那些知识点呢 这是我做的思维导图 。。。

2672 次点击
所在节点   Go 编程语言  Go 编程语言
15 条回复
yuikns
yuikns
2020-07-13 12:33:48 +08:00
你这个需求不明确
golang 自带 http server 库,也可以用 gin 等。如果是做个 client 转发,如果不是自定义 404/301 。
问题在哪?
sirgod
sirgod
2020-07-13 12:34:25 +08:00
你用 go 写过 http 服务吗?
chaodada
chaodada
2020-07-13 12:40:11 +08:00
@sirgod #2 之前做过,但是用 nginx 转发到 golang 这个,我是想让请求都经过 golang 进行处理,然后转发到 nginx 或者其他服务
yrj
yrj
2020-07-13 12:46:39 +08:00
你提问的就是流程(思路)。如果你还不知道,那应该从基础学一下
wangritian
wangritian
2020-07-13 12:48:32 +08:00
需求拆开看,分 3 个部分,http 服务器,http 请求,过滤器,你说的拿到 80 443 端口的请求,其实就是个 http 服务器,拿到参数后走个过滤程序,通过后,uri 和参数不变,向业务服务器发请求,把结果返回给用户
yuikns
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 加个过滤。
不过强烈建议稍微了解下基础概念
yuikns
yuikns
2020-07-13 12:53:24 +08:00
另外,直接 golang 处理 https 可能不是一个很好的主意(当然这是可行的),因为这个证书管理可能会遇到点麻烦。你可以用 nginx 或者各种 slb 等代理一层,go 需要过滤处理 http 完事
reus
reus
2020-07-13 13:47:11 +08:00
会也不教你
brader
brader
2020-07-13 14:28:58 +08:00
你这个需求,更像做一个代理服务器,思路很简单,你先用 go 做成功一个代理功能,第一步什么也不要想,别去想什么过滤功能,你只要实现代理就好了,就想左手拿到数据,交给右手这样简单。
实现了第一步代理功能,第二步,就是 go 解析客户端的请求内容,做特征识别过滤,到这里你的需求就完成了。
chaodada
chaodada
2020-07-13 14:36:22 +08:00
@brader #9 @brader #9 号🤣🤣,就你说的最直白,哈哈哈对我太友好,我先去了解
eudore
eudore
2020-07-13 16:09:31 +08:00
没啥难点 大概写下伪代码 题主自己调试下
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)
}))
}
wangyzj
2020-07-13 16:43:51 +08:00
过滤条件复杂就用 go 自带的 http server 处理
不负责 nginx 就行了
sirgod
2020-07-13 17:57:07 +08:00
@chaodada 既然写过,那这个需求并不比通常的 http 服务更复杂,只不过监听了两个端口,443 端口需要指定证书和 key 的文件路径,不知道你的困难点在哪?是不知道怎么监听两个端口还是不知道怎么做反向代理还是别的?
chaodada
2020-07-15 18:36:10 +08:00
@eudore 谢谢大佬,参考您的代码 我已经可以做简单的反带了,接下来我要开始慢慢搞规则了 哈哈哈哈谢谢
chaodada
2020-07-15 18:36:31 +08:00
谢谢大家

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/689528

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX