【发布时间】:2017-03-20 02:32:08
【问题描述】:
我已经设置了一个简单的服务器来测试我的 TLS 证书,TLS 部分工作正常。我通过 CloudFlare 拥有我的 DNS。
我希望网站保持匿名,因此我将域更改为“example.com”。
这是简单服务器的代码:
package main
import (
"log"
"net/http"
)
var hostname = "example.com"
var key = "/srv/ssl/" + hostname + "-2017.03.20.key"
var cert = "/srv/ssl/ssl-bundle.crt"
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("TLS test"))
})
// go serveHTTP()
// go redirectHTTP()
serveHTTPS()
}
func serveHTTP() {
if err := http.ListenAndServe(":80", nil); err != nil {
log.Fatalf("ListenAndServe error: %v", err)
}
}
func redirectHTTP() {
err := http.ListenAndServe(":80", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "https://"+hostname+r.RequestURI, http.StatusMovedPermanently)
}))
if err != nil {
log.Fatalf("ListenAndServe error: %v", err)
}
}
func serveHTTPS() {
log.Fatal(http.ListenAndServeTLS(":443", cert, key, nil))
}
现在如果我像这样运行服务器,然后转到https://example.com,那么它就不起作用了。
但是,如果我将允许我提供 HTTP 的部分更改为:
go serveHTTP()
// go redirectHTTP()
serveHTTPS()
然后突然之间 HTTP 和 HTTPS 都可以工作了。因此,如果我通过输入http://example.com 和https://example.com 访问我的网站,两者都可以正常工作。
如果我注释掉 go serveHTTP() 并尝试像这样将 HTTP 重定向到 HTTPS:
// go serveHTTP()
go redirectHTTP()
serveHTTPS()
然后我在屏幕上看到这个:
如果我改回这个:
// go serveHTTP()
// go redirectHTTP()
serveHTTPS()
并且访问页面不是通过域名,而是通过ip地址,我当然会收到警告,因为证书不是发给ip地址,而是我使用的域名。
如果我通过单击高级并添加异常来坚持,那么它可以工作。
所以实际上它是在端口 443 上提供服务的,但是试图通过域名访问页面,让它通过 CloudFlare DNS,然后它不起作用。
即使我只将 CloudFlare 用作“仅 DNS”,也没有关系:
或者如果我换成代理,还是一样:
我已关闭缓存并使用开发者模式,以便从我的服务器获得“实时响应”。
总结一下,由于我通过 CloudFlare 拥有我的 DNS,CloudFlare 不允许我在没有 HTTP 的情况下提供 HTTPS。我需要没有 HTTP 重定向的 HTTP 和 HTTPS。这真的很奇怪,我不知道如何解决这个问题。服务器通过 443 提供服务,因为正如我所展示的,如果我尝试通过 IP 地址访问该页面并添加安全异常,则该页面实际上正在提供服务。
我能做什么?
【问题讨论】:
-
请注意,“仅 DNS”模式下的 Cloudflare 不会与 HTTP(S) 交互,因为 Cloudflare 将不再代理您的流量。默认情况下,当您只输入
example.com时,浏览器会尝试http://example.com,因此除非您指定https://example.com,否则它将失败。因此,您应该在 80 上监听,重定向到 HTTPS,如果您希望第一次请求后的默认行为是 HTTPS(始终),请使用 HSTS:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… -
感谢您提供有用的信息!
标签: go cloudflare