Skip to content

跨域资源共享(CORS)

概述

CORS(跨域资源共享)是一种通过附加 HTTP 头信息机制,告知浏览器允许运行在某一个源(origin)的 Web 应用访问来自不同源的指定资源。当 Web 应用请求与其自身域名、协议或端口不同的资源时,就会发起跨域 HTTP 请求。启用 CORS 需要添加一组特定的头部信息,让浏览器与服务器沟通关于允许或禁止的请求、方法和头部。CORS 还支持预检(pre-flight)OPTIONS 请求。

多数情况下,API 与客户端处于不同域。出于安全考虑,浏览器会限制脚本发起的跨域 HTTP 请求,因此需要为 API 配置 CORS。

启用 CORS

CORS 设置可在路由器上配置,并通过路由元数据被子路由器继承。CORS 中间件会自动全局加载。

go
import (
	"goyave.dev/goyave/v5"
	"goyave.dev/goyave/v5/cors"
)

func Register(_ *goyave.Server, router *goyave.Router) {
	router.CORS(cors.Default())
	//...
}

INFO

  • 配置选项会通过键名 goyave.MetaCORS 存入路由元数据
  • 若为路由器启用 CORS,所有路由将自动添加 OPTIONS 方法

CORS 选项需在中间件和路由定义前设置。所有子路由器默认继承 CORS 配置。如需移除或修改子路由器的配置,只需创建新的 cors.Options 对象并重新赋值。

go
router.CORS(cors.Default())

subrouter := router.Subrouter("/products")
subrouter.CORS(nil) // 仅移除该子路由器的 CORS 配置

options := cors.Default()
options.AllowCredentials = true
subrouter.CORS(options) // 为该子路由器设置独立 CORS 配置

WARNING

  • 避免盲目使用默认配置。虽然适用于常见场景,但建议根据需求自定义 AllowedOriginsAllowedHeaders
  • 查看 go.pkg.dev 参考文档 了解所有可用选项及其默认值