Golang请求路由服务器实现指南
Golang请求路由服务器实现指南 有没有办法区分并路由来自浏览器和命令行的请求?
例如:我的负载服务器(运行在80端口)会收到来自浏览器和命令行的两种请求,后端还有两个请求服务器分别运行在8081和8082端口。如果负载服务器:80收到命令行请求,应重定向到请求服务器:8081;如果是浏览器请求,则重定向到请求服务器:8082。
提前感谢。
抱歉,我不太明白这与您描述的问题有何关联。在我看来这似乎只是不同的服务……
更多关于Golang请求路由服务器实现指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
也许你可以使用请求头。网页浏览器会填充一些在命令行请求中可能找不到的附加信息。
嗨 @NobbZ,
两者将分开提供,但为了方便用户,我正在使用另一台服务器(第三台)来根据请求路由请求。
也许可以通过用户代理实现,但这已经是很老派的做法了……
在我看来,如果存在不同用途的服务器,应该将它们分别独立部署,这样每个使用者都能连接到专属的服务器。
你可以使用这个列表(https://en.wikipedia.org/wiki/List_of_HTTP_header_fields)。
浏览器发出的请求和自定义请求之间,某些键名或现有键名的对应值可能会有所不同。
我需要什么样的额外信息?我看到的信息都是一样的,只有用户代理在变化,对于命令行会显示 CURL/…/…。如果你指的是相同的情况,能否告诉我通用的方法来区分各种浏览器及其不同版本,以及命令行(CURL)版本?
在处理程序中,您可能会这样做来改变行为:
userAgent := req.Header.Get("user-agent")
baseUA := strings.Split(userAgent, "/")[0]
if baseUA == "curl" {
fmt.Println("doing command line stuff")
} else {
fmt.Println("doing browser stuff")
}
除非您的命令行界面用户在使用curl时设置了自定义用户代理,否则这种方法可能有效。
具体来说,我正在运行一个Git服务器(Golang)和代码库查看服务器(Java)。我的应用需要完全实现类似 https://android.googlesource.com/ 的功能。
如果两者使用相同语言会非常简单,但我用Golang开发而Gitiles是Java编写的。因此我计划在另一个端口上运行服务来处理请求。
Gitiles in Go Programming language 是否有Go语言版本的Gitiles?如果没有,是否有其他替代方案?
在Go语言中,可以通过检查HTTP请求头中的User-Agent字段来区分浏览器请求和命令行请求(如curl)。浏览器通常会发送包含特定标识(如"Chrome"、"Firefox"等)的User-Agent,而命令行工具(如curl)的User-Agent通常较简单或为空。以下是一个完整的示例实现:
- 首先,在负载服务器(端口80)上设置一个HTTP处理函数,检查请求的User-Agent。
- 根据结果,将请求重定向到相应的后端服务器(8081或8082)。
示例代码
package main
import (
"net/http"
"strings"
)
func main() {
http.HandleFunc("/", routeHandler)
http.ListenAndServe(":80", nil)
}
func routeHandler(w http.ResponseWriter, r *http.Request) {
userAgent := r.Header.Get("User-Agent")
// 检查User-Agent是否包含常见浏览器标识
if isBrowserRequest(userAgent) {
// 浏览器请求:重定向到8082端口
http.Redirect(w, r, "http://localhost:8082", http.StatusTemporaryRedirect)
} else {
// 命令行请求:重定向到8081端口
http.Redirect(w, r, "http://localhost:8081", http.StatusTemporaryRedirect)
}
}
// isBrowserRequest 检查User-Agent是否来自浏览器
func isBrowserRequest(userAgent string) bool {
// 常见浏览器标识列表
browserKeywords := []string{
"Chrome", "Firefox", "Safari", "Edge", "Opera", "MSIE", "Trident",
}
userAgent = strings.ToLower(userAgent)
for _, keyword := range browserKeywords {
if strings.Contains(userAgent, strings.ToLower(keyword)) {
return true
}
}
return false
}
说明
- 负载服务器:运行在端口80,使用
routeHandler处理所有传入请求。 - User-Agent检查:
isBrowserRequest函数检查User-Agent字符串是否包含常见浏览器的关键词(如Chrome、Firefox)。如果匹配,则认定为浏览器请求;否则,认定为命令行请求。 - 重定向:使用
http.Redirect将请求重定向到对应的后端服务器(8081用于命令行,8082用于浏览器)。
测试方法
- 浏览器请求:在浏览器中访问
http://localhost,请求将被重定向到http://localhost:8082。 - 命令行请求:使用curl命令(如
curl http://localhost),请求将被重定向到http://localhost:8081。
注意:此方法依赖于User-Agent的准确性。如果命令行工具模拟浏览器User-Agent,可能会被误判。对于更精确的控制,可以考虑其他方法如检查特定头或使用API密钥。


