- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在用 Go 编写自己的 ReverseProxy。ReverseProxy 应该连接我的 go-web 服务器和我的 apache2 网络服务器。但是当我在另一个 IP 地址上运行我的反向代理然后我的 Apache2 网络服务器时,当反向代理将请求发送到 apache 时,我的 apache 日志文件中出现以下错误。
"Hosname xxxx provided via sni and hostname xxxx2 provided via http are different"
我的反向代理和 apache-webserver 在 https 上运行。
这里是一些代码:
func (p *Proxy) directorApache(req *http.Request) {
mainServer := fmt.Sprintf("%s:%d", Config.HostMain, Config.PortMain)
req.URL.Scheme = "https"
req.URL.Host = mainServer
}
func (p *Proxy) directorGo(req *http.Request) {
goServer := fmt.Sprintf("%s:%d", Config.GoHost, Config.GoPort)
req.URL.Scheme = "http"
req.URL.Host = goServer
}
func (p *Proxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
fmt.Println(req.URL.Path)
if p.isGoRequest(req) {
fmt.Println("GO")
p.goProxy.ServeHTTP(rw, req)
return
}
p.httpProxy.ServeHTTP(rw, req)
}
func main() {
var configPath = flag.String("conf", "./configReverse.json", "Path to the Json config file.")
flag.Parse()
proxy := New(*configPath)
cert, err := tls.LoadX509KeyPair(Config.PathCert, Config.PathPrivateKey)
if err != nil {
log.Fatalf("server: loadkeys: %s", err)
}
config := tls.Config{InsecureSkipVerify: true, Certificates: []tls.Certificate{cert}}
listener, err := net.Listen("tcp",
net.JoinHostPort(proxy.Host, strconv.Itoa(proxy.Port)))
if err != nil {
log.Fatalf("server: listen: %s", err)
}
log.Printf("server: listening on %s")
proxy.listener = tls.NewListener(listener, &config)
serverHTTPS := &http.Server{
Handler: proxy.mux,
TLSConfig: &config,
}
if err := serverHTTPS.Serve(proxy.listener); err != nil {
log.Fatal("SERVER ERROR:", err)
}
}
也许有人对这个问题有想法。
最佳答案
假设您正在向 https://your-proxy.local
发起 HTTP 请求.您的请求处理程序采用 http.Request
构造并重写其 URL
字段到 https://your-apache-backend.local
.
您没有考虑到的是,原始 HTTP 请求还包含一个 Host
header (Host: your-proxy.local
)。将相同的请求传递给 http://your-apache-backend.local
时, Host
该请求中的 header 仍然显示 Host: your-proxy.local
.这就是 Apache 所提示的。
当您将 TLS 与服务器名称指示 (SNI) 结合使用时,请求主机名不仅会用于 DNS 解析,还会用于选择应该用于建立 TLS 连接的 SSL 证书。 HTTP 1.1 Host
另一方面,header 被 Apache 用来区分几个虚拟主机。两个名称必须匹配。 Apache HTTPD wiki 中也提到了这个问题。 :
SNI/Request hostname mismatch, or SNI provides hostname and request doesn't.
This is a browser bug. Apache will reject the request with a 400-type error.
同时重写 Host
header 。如果你想保留原来的Host
header ,您可以将其存储在 X-Forwarded-Host
中 header (这是一个非标准 header ,但它广泛用于反向代理):
func (p *Proxy) directorApache(req *http.Request) {
mainServer := fmt.Sprintf("%s:%d", Config.HostMain, Config.PortMain)
req.URL.Scheme = "https"
req.URL.Host = mainServer
req.Header.Set("X-Forwarded-Host", req.Header().Get("Host"))
req.Host = mainServer
}
关于ssl - 带有 Apache2 SNI/主机名错误的 Golang ReverseProxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34745654/
我的客户正在使用 ReverseProxy 调用另一个服务,该服务最多需要 60 秒来响应我的请求。但我的客户只等了 30-35 秒。我需要将等待时间增加 60 秒。我该怎么做? 最佳答案 您可能正在
package main import ( "net/http" "net/http/httputil" "net/url" ) func main() { targe
这是 Apache 虚拟主机配置的一部分,匹配的传入请求被转发到 Apache Tomcat 服务器。所有客户端都必须发送客户端证书以对 App1 进行身份验证,但对于 App2 来说,它应该是可选的
问题 我正在尝试在 apache 服务器后面使用 laravel websockets 库设置实时环境。 Websocket 服务器在端口 6001 上运行(无法从外部访问)。 Apache VHos
我的主 Web 服务器中有反向代理,专用于特定的微服务,并处理转发到其适当微服务的请求。 func newTrimPrefixReverseProxy(target *url.URL, prefix
我正在使用 GOLANG 编写一个有特殊要求的 ReverseProxyReverseProxy 工作得很好。但我对特殊要求有疑问用户发送 Http Post 表单包含用户和电子邮件我想向帖子表单添加
任何能够将 Golang 的 ReverseProxy 功能与 Iris-Go 网络框架连接起来的人。我无法让它工作。我可以用普通的 net/http 连接它。 func MultiHostRever
我正在尝试对以下代码进行单元测试: func(h *Handler)Forward(w http.ResponseWriter, r *http.Request) { url, err :=
我基本上是在尝试编写一个反向代理服务器,这样当我 curl localhost:8080/get 时,它会将请求代理到 https://nghttp2.org/httpbin/get 。 Note:
我有网站 https://a-b-c.com和 https://www.x-y-z.com在端口上的反向代理后面运行 4444和 5555分别。 我将它们配置为使用 letsencrypt tls 证
我想我在我的头上,无法弄清楚如何调试或从这里去哪里?!任何指导将不胜感激! 问题: 开发环境:一切正常 生产:我收到“请求超时”错误 目标: 让“www.site.com/blog”显示来自“blog
我想构建一个 http 反向代理来检查 HTTP 正文,然后将 HTTP 请求发送到它的上游服务器。你怎么能在 go 中做到这一点? 初始尝试(如下)失败,因为 ReverseProxy 复制传入请求
我正在用 Go 编写自己的 ReverseProxy。ReverseProxy 应该连接我的 go-web 服务器和我的 apache2 网络服务器。但是当我在另一个 IP 地址上运行我的反向代理然后
我正在使用 httputil.ReverseProxy 将 Amazon s3 文件代理给我的客户。我想隐藏所有来自 Amazon 的 header - 是否可以在无需重新实现反向代理的情况下实现?
我正在尝试同时使用 gorilla mux 和 httputil.ReverseProxy,但是在尝试获取 mux.Vars 时它是空的。根据https://golang.org/src/net/ht
在 Go 中,我使用 NewSingleHostReverseProxy 来执行反向代理,但是我需要确认主机站点的 SSL 证书,以确保我拥有正确的安全证书......我应该如何做?我应该与处理程序或
我正在努力应对这样一种情况:我有多个应用程序要在单个 TorqueBox 实例上运行。当定义应用程序并将其部署到 config/torquebox.yml 中的根 (“/”) 上下文时,应用程序可以正
我正在使用核心 net/http/httputil/ReverseProxy 库在 Go 中编写反向代理服务器。我已经使用了自定义 Director,我需要为传输定义自己的 RoundTrip 和 D
我用 Go 编写的自己的 ReverseProxy 遇到了一些麻烦。我想将我的 Golang-Web 服务器与我的 Apache Web 服务器连接起来。我的 Apache Web 服务器也应该在 h
我正在尝试使用反向代理(在 Apache 上)为 Magento 设置 Varnish 缓存以获取 https 缓存。我无法让它工作。到目前为止,我在设置反向代理时得到了 ERR_TOO_MANY_R
我是一名优秀的程序员,十分优秀!