V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
chaodada
V2EX  ›  Go 编程语言

golang 小白求大佬指教

  •  
  •   chaodada · 2020-07-13 12:21:15 +08:00 · 2423 次点击
    这是一个创建于 1375 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    15 条回复    2020-07-15 18:36:31 +08:00
    yuikns
        1
    yuikns  
       2020-07-13 12:33:48 +08:00
    你这个需求不明确
    golang 自带 http server 库,也可以用 gin 等。如果是做个 client 转发,如果不是自定义 404/301 。
    问题在哪?
    sirgod
        2
    sirgod  
       2020-07-13 12:34:25 +08:00
    你用 go 写过 http 服务吗?
    chaodada
        3
    chaodada  
    OP
       2020-07-13 12:40:11 +08:00 via iPhone
    @sirgod #2 之前做过,但是用 nginx 转发到 golang 这个,我是想让请求都经过 golang 进行处理,然后转发到 nginx 或者其他服务
    yrj
        4
    yrj  
       2020-07-13 12:46:39 +08:00 via iPad
    你提问的就是流程(思路)。如果你还不知道,那应该从基础学一下
    wangritian
        5
    wangritian  
       2020-07-13 12:48:32 +08:00
    需求拆开看,分 3 个部分,http 服务器,http 请求,过滤器,你说的拿到 80 443 端口的请求,其实就是个 http 服务器,拿到参数后走个过滤程序,通过后,uri 和参数不变,向业务服务器发请求,把结果返回给用户
    yuikns
        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 加个过滤。
    不过强烈建议稍微了解下基础概念
    yuikns
        7
    yuikns  
       2020-07-13 12:53:24 +08:00
    另外,直接 golang 处理 https 可能不是一个很好的主意(当然这是可行的),因为这个证书管理可能会遇到点麻烦。你可以用 nginx 或者各种 slb 等代理一层,go 需要过滤处理 http 完事
    reus
        8
    reus  
       2020-07-13 13:47:11 +08:00 via Android
    会也不教你
    brader
        9
    brader  
       2020-07-13 14:28:58 +08:00
    你这个需求,更像做一个代理服务器,思路很简单,你先用 go 做成功一个代理功能,第一步什么也不要想,别去想什么过滤功能,你只要实现代理就好了,就想左手拿到数据,交给右手这样简单。
    实现了第一步代理功能,第二步,就是 go 解析客户端的请求内容,做特征识别过滤,到这里你的需求就完成了。
    chaodada
        10
    chaodada  
    OP
       2020-07-13 14:36:22 +08:00 via iPhone
    @brader #9 @brader #9 号🤣🤣,就你说的最直白,哈哈哈对我太友好,我先去了解
    eudore
        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)
    }))
    }
    wangyzj
        12
    wangyzj  
       2020-07-13 16:43:51 +08:00
    过滤条件复杂就用 go 自带的 http server 处理
    不负责 nginx 就行了
    sirgod
        13
    sirgod  
       2020-07-13 17:57:07 +08:00
    @chaodada 既然写过,那这个需求并不比通常的 http 服务更复杂,只不过监听了两个端口,443 端口需要指定证书和 key 的文件路径,不知道你的困难点在哪?是不知道怎么监听两个端口还是不知道怎么做反向代理还是别的?
    chaodada
        14
    chaodada  
    OP
       2020-07-15 18:36:10 +08:00
    @eudore 谢谢大佬,参考您的代码 我已经可以做简单的反带了,接下来我要开始慢慢搞规则了 哈哈哈哈谢谢
    chaodada
        15
    chaodada  
    OP
       2020-07-15 18:36:31 +08:00
    谢谢大家
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   996 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:16 · PVG 06:16 · LAX 15:16 · JFK 18:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.