V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
chaodada
0.59D

golang 小白求大佬指教

  •  
  •   chaodada · Jul 13, 2020 · 3075 views
    This topic created in 2120 days ago, the information mentioned may be changed or developed.

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

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

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