跨域资源共享(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
- 避免盲目使用默认配置。虽然适用于常见场景,但建议根据需求自定义
AllowedOrigins
和AllowedHeaders
- 查看 go.pkg.dev 参考文档 了解所有可用选项及其默认值