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