- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
目前。我有下面一行(效果很好)
http.ListenAndServeTLS(":"+Config.String("port"), Config.Key("https").String("cert"), Config.Key("https").String("key"), router)
当我尝试将端口设置为 443 而不是 8080 时,问题就来了。我在浏览器上收到以下错误 (Chrome)
This site can’t provide a secure connection.
www.example.com sent an
invalid response. ERR_SSL_PROTOCOL_ERROR
我不确定自己做错了什么,或者我是否不应该在端口 443 上运行服务器?
最佳答案
我能想到发生这种情况的两个原因
由于标记标签无法解决第一个问题,因此本答案将涵盖第二个问题。
发生此问题是因为默认情况下,当您键入 www.domain.com 之类的地址时,您的浏览器会尝试使用端口 80 上的 http 协议(protocol)联系 url 域,这是一个已知行为 Golang ListenAndServeTLS returns data when not using https in the browser
现在,如果您在浏览器中输入具有适当方案的完整 URL,例如 https://www.domain.com
,浏览器将通过端口 443 访问服务器并启动 TLS 握手与您的服务器,从而呈现正确的数据。
现在,您知道这一点,但您的用户却不知道。如果您的用户每次尝试仅使用您的域作为 URL 访问您的 Web 应用程序时都收到 SSL 握手错误通知,那将是非常令人沮丧的。
为了避免这个问题,您可以在端口 :80(或 8080)上的服务器启动一个 go 例程,使用这段简单的代码将所有请求重定向到端口 443:
// redir is a net.Http handler which redirects incoming requests to the
// proper scheme, in this case being https
func redir(w http.ResponseWriter, req *http.Request) {
hostParts := strings.Split(req.Host, ":")
http.Redirect(w, req, "https://"+hostParts[0]+req.RequestURI, http.StatusMovedPermanently)
}
func main() {
// this go subroutine creates a server on :8080 and uses the redir handler
go func() {
err := http.ListenAndServe(":8080", http.HandlerFunc(redir))
if err != nil {
panic("Error: " + err.Error())
}
}()
http.ListenAndServeTLS(":"+Config.String("port"), Config.Key("https").String("cert"), Config.Key("https").String("key"), router)
}
希望对你有帮助干杯,
关于ssl - 去 ListenAndServeTLS 握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37878460/
我是一名优秀的程序员,十分优秀!