登录
首页 >  Golang >  Go问答

GoLang NewSingleHostReverseProxy 正在浏览器中做缓存

来源:stackoverflow

时间:2024-03-21 13:16:28 446浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《GoLang NewSingleHostReverseProxy 正在浏览器中做缓存》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

我在 golang 中构建了一个简单的反向代理,它从服务器列表中路由到随机服务器。

package main

import (
  "fmt"
  "log"
  "math/rand"
  "net/http"
  "net/http/httputil"
  "net/url"
  "time"
)

func main() {

    servers := []string{"http://localhost:8080", "http://localhost:8080/a", "http://localhost:8080/b"}

    rand.seed(time.now().unix())

    http.handlefunc("/", func(w http.responsewriter, r *http.request) {
        randomindex := rand.intn(len(servers))
        randomserver := servers[randomindex]

        fmt.printf("chosen server: %v\n", randomserver)

        host, err := url.parse(randomserver)
        if err != nil {
            log.fatal(err)
            return
        }
        proxy := httputil.newsinglehostreverseproxy(host)

        proxy.servehttp(w, r)

    })

    http.listenandserve(":8082", nil)

}

然后,我构建了一个简单的网络服务器,它公开了在 8080 上运行的路由 //a/b

package main

import (
    "net/http"
)

func main() {

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("This is Route /"))
    })

    http.HandleFunc("/a", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("This is Route a"))
    })

    http.HandleFunc("/b", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("This is Route b"))
    })

    http.ListenAndServe(":8080", nil)
}

现在,当我在浏览器上打开 localhost:8082 时,每次刷新时,我应该随机显示 //a//b,但我每次都会得到 /。 print语句每次都会打印一个随机服务器,所以随机逻辑没有问题,但是浏览器总是显示/

即使我从服务器列表中删除 localhot:8080 并重新加载 go 项目,它仍然会打开 /

顺便说一句,在关闭端口 8082 上的服务器后,如果我尝试 lsof -i:8082,我会得到一个正在运行某些内容的 brave 浏览器实例

我在这里附上了整个问题的视频 - https://youtu.be/kiet4qf7rsy

不知何故,即使不是第一个选择的路线,该路线也会被缓存


正确答案


问题出在后端服务器。

代理连接目标服务器路径和请求路径。目标路径/a与请求路径/连接的结果为/a/

后端服务器上的传入路径 /a/ 与 mux 模式 /a 不匹配,但该路径与模式 / 匹配。结果将调用 / 的处理程序。有关多路复用器如何将传入请求路径与注册模式进行匹配的更多信息,请参阅 ServeMux documentation

通过在路线 a 和 b 的模式中添加尾部斜杠来修复:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("This is Route /"))
})

http.HandleFunc("/a/", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("This is Route a"))
})

http.HandleFunc("/b/", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("This is Route b"))
})

今天关于《GoLang NewSingleHostReverseProxy 正在浏览器中做缓存》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>