Go CloudFlare不允许我只提供HTTPS,它只有在我提供HTTP和HTTPS的同时才起作用

Go CloudFlare不允许我只提供HTTPS,它只有在我提供HTTP和HTTPS的同时才起作用,go,cloudflare,Go,Cloudflare,我已经设置了一个简单的服务器来测试我的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 = "

我已经设置了一个简单的服务器来测试我的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
,两者都可以正常工作

如果我注释掉
转到serveHTTP()
并尝试将HTTP重定向到HTTPS,如下所示:

// go serveHTTP()
go redirectHTTP()
serveHTTPS()
然后我在屏幕上看到:

如果我改回这个:

// go serveHTTP()
// go redirectHTTP()
serveHTTPS()
并不是通过域名访问页面,而是通过ip地址,我当然会收到警告,因为证书不是颁发给ip地址的,而是我使用的域名

如果我通过单击advanced并添加exception来坚持,那么它就可以工作了

因此,实际上它是在端口443提供服务的,但是试图通过域名访问页面,这让它通过CloudFlare DNS,然后它就不工作了

即使我仅将CloudFlare用作“仅DNS”,这也无关紧要:

或者,如果我改为代理,仍然相同:

我已关闭缓存,并使用开发人员模式,以便从服务器获取“实时响应”

简而言之,由于我通过CloudFlare拥有DNS,CloudFlare不允许我在没有HTTP的情况下提供HTTPS。我需要没有HTTP重定向的HTTP和HTTPS。这真的很奇怪,我不知道如何修复它。服务器通过443提供服务,因为正如我所展示的,如果我尝试通过IP地址访问页面并添加安全异常,页面实际上正在被提供服务


当Cloudflare设置为灵活的SSL模式(而不是HTTPS)时,我能做什么

从Cloudflare KB:

您不需要在web服务器上拥有SSL证书,但是 您的访问者仍然认为该站点启用了HTTPS。此选项 如果您的计算机上有任何敏感信息,则不建议使用 网站。此设置仅适用于端口443->80,不适用于 我们支持的其他端口,如2053。它只能用作最后一个 如果您无法在自己的web服务器上设置SSL,但 比任何其他选项都不安全(甚至“关闭”),甚至可能 当你决定离开它时给你带来麻烦:我该如何修复 无限重定向循环

要更改此设置,请转到Cloudflare仪表板中的Crypto选项卡,并在SSL选项中将“Flexible”更改为“Full(Strict)”(如果您使用的是自签名证书,则更改为“Full”)


请注意,“仅DNS”模式下的Cloudflare不会与HTTP交互,因为Cloudflare将不再代理您的流量。浏览器将尝试
http://example.com
当您在默认情况下只输入
example.com
时,除非您指定
https://example.com
,它将失败。因此,您应该收听80,重新定向到HTTPS,如果您希望第一次请求后的默认行为是HTTPS(始终),请使用HSTS:谢谢,这是有用的信息!