golang 小白求大佬指教

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

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

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

2626 次点击
所在节点    Go 编程语言
15 条回复
yuikns
2020-07-13 12:33:48 +08:00
你这个需求不明确
golang 自带 http server 库,也可以用 gin 等。如果是做个 client 转发,如果不是自定义 404/301 。
问题在哪?
sirgod
2020-07-13 12:34:25 +08:00
你用 go 写过 http 服务吗?
chaodada
2020-07-13 12:40:11 +08:00
@sirgod #2 之前做过,但是用 nginx 转发到 golang 这个,我是想让请求都经过 golang 进行处理,然后转发到 nginx 或者其他服务
yrj
2020-07-13 12:46:39 +08:00
你提问的就是流程(思路)。如果你还不知道,那应该从基础学一下
wangritian
2020-07-13 12:48:32 +08:00
需求拆开看,分 3 个部分,http 服务器,http 请求,过滤器,你说的拿到 80 443 端口的请求,其实就是个 http 服务器,拿到参数后走个过滤程序,通过后,uri 和参数不变,向业务服务器发请求,把结果返回给用户
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
2020-07-13 12:53:24 +08:00
另外,直接 golang 处理 https 可能不是一个很好的主意(当然这是可行的),因为这个证书管理可能会遇到点麻烦。你可以用 nginx 或者各种 slb 等代理一层,go 需要过滤处理 http 完事
reus
2020-07-13 13:47:11 +08:00
会也不教你
brader
2020-07-13 14:28:58 +08:00
你这个需求,更像做一个代理服务器,思路很简单,你先用 go 做成功一个代理功能,第一步什么也不要想,别去想什么过滤功能,你只要实现代理就好了,就想左手拿到数据,交给右手这样简单。
实现了第一步代理功能,第二步,就是 go 解析客户端的请求内容,做特征识别过滤,到这里你的需求就完成了。
chaodada
2020-07-13 14:36:22 +08:00
@brader #9 @brader #9 号🤣🤣,就你说的最直白,哈哈哈对我太友好,我先去了解
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