nginx http重定向https 无效_Golang设置https访问,以及http如何重定向到https

本文介绍了如何使用Golang设置HTTPS监听,解决Nginx HTTP重定向HTTPS无效的问题。通过腾讯云免费申请SSL证书,并进行DNS验证。在Gin框架中实现HTTP到HTTPS的自动重定向,利用secure包创建中间件,确保安全访问。
摘要由CSDN通过智能技术生成

fbb58d0841d102778d478521676b8434.png

设置https访问:

初始代码为http监听:

func main() {
  server := &http.Server{
    Addr:           ":8080",
    ...
  }

  go func() {
    if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
      log.Fatalf(err, "Listen: %sn")
    }
  }()
  
  ...
}

变为https监听:

func main() {
  server := &http.Server{
    Addr:           ":8080",
    ...
  }

  go func() {
    if err := server.ListenAndServeTLS("conf/server.crt", "conf/server.key"); err != nil && err != http.ErrServerClosed {
      log.Fatalf(err, "Listen: %sn")
    }
  }()

  ...
}

其中ListenAndServeTLS方法的两个参数为SSL证书的下载文件,网上有专门生成证书的命令或工具,这种情况得到的证书,虽然可以访问https,但证书无效,浏览器地址栏提示不安全。

腾讯云可以免费申请SSL证书,但需要对填写的域名进行验证,如果不是腾讯云的域名,还需要去域名对应解析商进行验证,所以最好使腾讯云的域名。

新用户在腾讯云花1块钱买了个域名,自带SSL证书,域名审核通过后,申请免费SSL证书,填写该域名,选择自动DNS验证,验证通过后,即可下载证书。从下载内容Apache文件夹中取出一个.crt文件和.key文件存放本地,作为server.ListenAndServeTLS()函数的两个参数,参数传文件路径即可。

此时启动项目,访问:https://localhost:8080 可行,访问:http://localhost:8080 不可行。

https访问,提示不安全,证书无效:

如图:

ee69f19cae6e257c6ac0078351d6df08.png

这种情况,只需把ip替换成证书对应的域名即可,前提是域名已经和你的服务器ip进行了解析。这里我用刚申请的域名和我本地电脑ip进行了解析,用域名进行访问后,显示正常,不再提示不安全:

703c804cb9e65568494d78f0522da5d8.png

http重定向到https:

此处结合Gin框架处理,http重定向到https,用到第三方包:

go get github.com/unrolled/secure

利用secure包写一个中间件,设置http重定向到https具体哪个url上:

//设置http重定向到https
func TlsHandler() gin.HandlerFunc {
  return func(c *gin.Context) {
    secureMiddleware := secure.New(secure.Options{
      SSLRedirect: true,
      SSLHost:     "dubinyang.xyz:8081",
    })
    
    err := secureMiddleware.Process(c.Writer, c.Request)
    if err != nil {
      return
    }
    
    c.Next()
  }
}

main函数里同时监听http和https:

func main() {
  g:= gin.Default()
  //加载中间件
  g.Use(TlsHandler())

  server := &http.Server{
    Addr:           ":8080",
    ...
  }
  
  //监听http
  go func() {
    if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
      log.Fatalf(err, "Listen: %sn")
    }
  }()

  //监听https
  go func() {
    //端口不可重复监听
    //此处更换8080端口为8081,直接用gin的RunTLS()函数进行监听
    //继续用server的ListenAndServeTLS()函数效果一样,建server2,Addr变为为":8081"即可
    if err := g.RunTLS(":8081", "conf/server.crt", "conf/server.key"); err != nil && err != http.ErrServerClosed {
      log.Fatalf(err, "Listen: %sn")
    }
  }()

  ...
}

如果http监听80端口,https监听443端口,两个端口都可隐藏,重定向时地址栏不会显示端口变化。

公众号:李田路口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值