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 跨域资源共享内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang elasticsearch Client的使用详解

    golang elasticsearch Client的使用详解

    这篇文章主要介绍了golang elasticsearch Client的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go语言LeetCode题解1046最后一块石头的重量

    Go语言LeetCode题解1046最后一块石头的重量

    这篇文章主要为大家介绍了Go语言LeetCode题解1046最后一块石头的重量,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 一文带你理解Golang中的Time结构

    一文带你理解Golang中的Time结构

    根据golang的time包的文档可以知道,golang的time结构中存储了两种时钟,一种是Wall Clocks,一种是Monotonic Clocks,下面我们就来简单了解一下这两种结构吧
    2023-09-09
  • 基于Go+OpenCV实现人脸识别功能的详细示例

    基于Go+OpenCV实现人脸识别功能的详细示例

    OpenCV是一个强大的计算机视觉库,提供了丰富的图像处理和计算机视觉算法,本文将向你介绍在Mac上安装OpenCV的步骤,并演示如何使用Go的OpenCV绑定库进行人脸识别,需要的朋友可以参考下
    2023-07-07
  • 浅析golang开发Error的使用详解

    浅析golang开发Error的使用详解

    Error是Go语言开发中最基础也是最重要的部分,很多朋友不明白goland error的一些基本使用方法,今天通过本文给大家详细介绍下,需要的朋友参考下吧
    2021-07-07
  • Go语言实现热更新具体步骤

    Go语言实现热更新具体步骤

    这篇文章主要为大家介绍了Go语言实现热更新具体步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 对Go语言中的context包源码分析

    对Go语言中的context包源码分析

    这篇文章主要对Go语言中的context包源码进行分析,context包析是1.15,context包定义了一个Context类型过这个Context接口类型, 就可以跨api边界/跨进程传递一些值,下面我们就来对context包源码进行分析,需要的小伙伴可以参考一下
    2022-02-02
  • Golang分布式注册中心实现流程讲解

    Golang分布式注册中心实现流程讲解

    这篇文章主要介绍了Golang分布式注册中心实现流程,注册中心可以用于服务发现,服务注册,配置管理等方面,在分布式系统中,服务的发现和注册是非常重要的组成部分,需要的朋友可以参考下
    2023-05-05
  • Golang如何调用windows下的dll动态库中的函数

    Golang如何调用windows下的dll动态库中的函数

    这篇文章主要介绍了Golang如何调用windows下的dll动态库中的函数方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go语言基础函数基本用法及示例详解

    Go语言基础函数基本用法及示例详解

    这篇文章主要为大家介绍了Go语言基础函数基本用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11

最新评论