1 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超3個(gè)贊
簡(jiǎn)短示例
假設(shè)您正在向https://your-proxy.local
. 您的請(qǐng)求處理程序采用該http.Request
結(jié)構(gòu)并將其URL
字段重寫(xiě)為https://your-apache-backend.local
.
您沒(méi)有考慮的是,原始 HTTP 請(qǐng)求還包含一個(gè)Host
標(biāo)頭 ( Host: your-proxy.local
)。將相同的請(qǐng)求傳遞給 時(shí)http://your-apache-backend.local
,該請(qǐng)求中的Host
標(biāo)頭仍然顯示Host: your-proxy.local
. 這就是 Apache 所抱怨的。
解釋
當(dāng)您使用帶有服務(wù)器名稱指示 (SNI) 的 TLS 時(shí),請(qǐng)求主機(jī)名不僅會(huì)用于 DNS 解析,還會(huì)用于選擇用于建立 TLS 連接的 SSL 證書(shū)。Host
另一方面,Apache 使用HTTP 1.1標(biāo)頭來(lái)區(qū)分多個(gè)虛擬主機(jī)。兩個(gè)名稱必須匹配。Apache HTTPD wiki 中也提到了這個(gè)問(wèn)題:
SNI/請(qǐng)求主機(jī)名不匹配,或 SNI 提供主機(jī)名而請(qǐng)求不提供。
這是瀏覽器錯(cuò)誤。Apache 會(huì)以 400 類型的錯(cuò)誤拒絕請(qǐng)求。
解決方案
還要重寫(xiě)Host
標(biāo)題。如果要保留原始Host
標(biāo)頭,可以將其存儲(chǔ)在X-Forwarded-Host
標(biāo)頭中(這是一個(gè)非標(biāo)準(zhǔn)標(biāo)頭,但它廣泛用于反向代理):
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
}
- 1 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報(bào)