Golang多个域名的跨域资源共享的实现

 更新时间:2025年02月17日 09:47:01   作者:gskyi  
本文主要介绍了Golang多个域名的跨域资源共享的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 Golang 中,处理多个域名的跨域资源共享 (CORS) 可以通过动态检查 Origin 并设置响应头来实现。以下是基于 Golang 的实现示例。

1. 动态判断域名并设置 CORS

根据请求的 Origin,判断是否允许,并动态设置 Access-Control-Allow-Origin

示例代码

package main

import (
	"net/http"
)

func main() {
	allowedOrigins := []string{
		"https://example1.com",
		"https://example2.com",
		"https://example3.com",
	}

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		origin := r.Header.Get("Origin")
		for _, o := range allowedOrigins {
			if origin == o {
				w.Header().Set("Access-Control-Allow-Origin", origin)
				w.Header().Set("Access-Control-Allow-Credentials", "true")
				w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
				w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
				break
			}
		}

		// Handle preflight request
		if r.Method == http.MethodOptions {
			w.WriteHeader(http.StatusNoContent)
			return
		}

		// Example response for other requests
		w.Write([]byte("CORS configured!"))
	})

	http.ListenAndServe(":8080", nil)
}

2. 使用第三方库 (Gin 框架)

如果使用 Gin,可以通过中间件实现动态域名的 CORS。

示例代码

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	allowedOrigins := []string{
		"https://example1.com",
		"https://example2.com",
		"https://example3.com",
	}

	r := gin.Default()

	// 自定义中间件处理 CORS
	r.Use(func(c *gin.Context) {
		origin := c.Request.Header.Get("Origin")
		for _, o := range allowedOrigins {
			if origin == o {
				c.Writer.Header().Set("Access-Control-Allow-Origin", origin)
				c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
				c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
				c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
				break
			}
		}

		// 如果是 OPTIONS 请求,提前返回
		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(204)
			return
		}

		c.Next()
	})

	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "CORS configured!"})
	})

	r.Run(":8080")
}

3. Nginx 配合 Golang 实现多个域名 CORS

如果使用 Nginx 作为反向代理,CORS 的域名过滤可以在 Nginx 层处理。具体配置如下:

示例 Nginx 配置

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        set $cors "";
        if ($http_origin ~* "(https://example1\.com|https://example2\.com|https://example3\.com)") {
            set $cors $http_origin;
        }
        add_header Access-Control-Allow-Origin $cors;
        add_header Access-Control-Allow-Credentials true;
        add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
        add_header Access-Control-Allow-Headers "Content-Type, Authorization";

        # Pass the request to your Golang app
        proxy_pass http://127.0.0.1:8080;
    }
}

注意事项

  • OPTIONS 请求处理:

    • OPTIONS 请求是浏览器发送的预检请求,用于检查是否允许跨域。
    • 必须对 OPTIONS 请求快速响应,返回 204 状态码。
  • 安全性:

    • 确保只允许可信的 Origin
    • 防止 CORS 头注入漏洞,严格验证请求头。
  • Access-Control-Allow-Credentials 限制:

    • 如果设置 Access-Control-Allow-Credentials: trueAccess-Control-Allow-Origin 不能是 *,必须指定具体的域名。

 到此这篇关于Golang多个域名的跨域资源共享的实现的文章就介绍到这了,更多相关Golang 跨域资源共享内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言实现机器大小端判断代码分享

    Go语言实现机器大小端判断代码分享

    这篇文章主要介绍了Go语言实现机器大小端判断代码分享,本文直接给出实现代码,需要的朋友可以参考下
    2014-10-10
  • 深入了解GoLang中的工厂设计模式

    深入了解GoLang中的工厂设计模式

    这篇文章主要介绍了深入了解GoLang中的工厂设计模式,工厂模式是一种常用的设计模式,它属于创建型模式,它的主要目的是封装对象的创建过程,将对象的创建过程与对象的使用过程分离,从而提高代码的可维护性和可扩展性,需要详细了解可以参考下文
    2023-05-05
  • Go语言中常用json处理操作小结

    Go语言中常用json处理操作小结

    在 Go 中,你可以使用内置的 encoding/json 包来处理 JSON 格式数据,本文整理了一些常见的 JSON 处理操作,希望对大家有所帮助
    2024-04-04
  • Go语言并发编程之互斥锁Mutex和读写锁RWMutex

    Go语言并发编程之互斥锁Mutex和读写锁RWMutex

    Go 语言中提供了很多同步工具,本文将介绍互斥锁Mutex和读写锁RWMutex的使用方法,想要具体了解的小伙伴,请参考下面文章详细内容,希望对你有所帮助
    2021-10-10
  • Go实现JWT认证中间件的项目实战

    Go实现JWT认证中间件的项目实战

    本文将介绍在Gin框架中实现完整的JWT认证方案,同时包含灵活的 Redis 集成选项,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • Go中标准库fmt包的使用小结

    Go中标准库fmt包的使用小结

    fmt包是Go语言处理输入输出的核心库,提供Print/Scan系列函数及多样格式化动词(如%v、%d、%s等),支持字符串格式化、扫描、自定义输出格式及错误处理,广泛用于数据格式化与输出控制,下面就来详细的介绍一下
    2025-09-09
  • Golang 并发下的问题定位及解决方案

    Golang 并发下的问题定位及解决方案

    由于 gin-swagger 是并发执行的, 输出的日志本身是错位,这就导致无法定义是哪一个结构体缺少 tag 导致的,这篇文章主要介绍了Golang 并发下的问题定位及解决方案,需要的朋友可以参考下
    2022-03-03
  • golang 实现json类型不确定时的转换

    golang 实现json类型不确定时的转换

    这篇文章主要介绍了golang 实现json类型不确定时的转换操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Golang AGScheduler动态持久化任务调度的强大库使用实例

    Golang AGScheduler动态持久化任务调度的强大库使用实例

    这篇文章主要为大家介绍了Golang AGScheduler动态持久化任务调度的强大库使用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Golang中的错误处理的示例详解

    Golang中的错误处理的示例详解

    这篇文章主要为大家详细介绍了Golang中的错误处理的相关资料,文章中的示例代码讲解详细,对我们学习Golang有一定帮助,需要的可以参考一下
    2022-11-11

最新评论