简短的例子
假设您正在向发起HTTP请求
https://your-proxy.local。您的请求处理程序采用该
http.Request结构,并将其
URL字段重写为
https://your-apache-backend.local。
您没有考虑的是,原始HTTP请求还包含一个
Host标头(
Host: your-proxy.local)。将相同的请求传递给该请求时
http://your-apache-backend.local,该请求中的
Host标头仍会显示
Host: your-proxy.local。这就是Apache所抱怨的。
说明
当您将TLS与服务器名称指示(SNI)一起使用时,请求主机名不仅将用于DNS解析,还将选择用于建立TLS连接的SSL证书。
Host另一方面,HTTP
1.1 标头用于通过Apache区分多个虚拟主机。两个名称 必须匹配 。Apache HTTPD
Wiki中也提到了此问题:
SNI /请求主机名不匹配,或者SNI提供了主机名而请求没有。
这是一个浏览器错误。Apache将拒绝该请求,并显示400类型错误。
解
还要重写
Host标题。如果要保留原始
Host标头,可以将其存储在
X-Forwarded-Host标头中(这是非标准标头,但在反向代理中广泛使用):
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}


