Solo.io Gloo 网关中的 CORS 配置详解
什么是 CORS?
跨源资源共享(Cross-Origin Resource Sharing,简称 CORS)是现代 Web 开发中一项重要的安全机制。它通过 HTTP 头部来控制浏览器是否允许一个域上的 Web 应用访问另一个域上的资源。
CORS 工作原理详解
浏览器出于安全考虑,实施了同源策略(Same-Origin Policy),默认情况下限制跨域请求。CORS 机制则提供了一种受控的方式来放宽这种限制。
当 Web 应用尝试发起跨域请求时,浏览器会:
- 对于"简单请求"(如 GET/POST 请求且使用标准头部),浏览器会直接发送请求,但会在请求头中添加 Origin 字段
- 对于"非简单请求"(如使用自定义头部或 PUT/DELETE 方法),浏览器会先发送一个 OPTIONS 预检请求
- 服务器通过响应头(如 Access-Control-Allow-Origin)告知浏览器是否允许该跨域请求
Gloo 网关中的 CORS 配置
在 Solo.io Gloo 网关中,CORS 配置可以在两个层级进行设置:
1. 虚拟主机(Virtual Host)级别配置
适用于该虚拟主机下的所有路由,配置示例如下:
apiVersion: gateway.solo.io/v1
kind: VirtualService
metadata:
name: corsexample
spec:
virtualHost:
options:
cors:
allowOrigin:
- https://example.com
allowMethods:
- GET
- POST
allowHeaders:
- Content-Type
2. 路由(Route)级别配置
适用于特定路由,可以覆盖虚拟主机级别的配置:
routes:
- matchers:
- exact: /api/pets
options:
cors:
allowOrigin:
- https://api.example.com
exposeHeaders:
- X-Custom-Header
核心配置参数详解
| 参数名 | 类型 | 说明 | 示例值 | |--------|------|------|--------| | allowOrigin | []string | 允许访问的源列表 | ["https://example.com"] | | allowOriginRegex | []string | 使用正则匹配允许的源 | ["https://.*.example.com"] | | allowMethods | []string | 允许的 HTTP 方法 | ["GET", "POST"] | | allowHeaders | []string | 允许的自定义请求头 | ["X-Custom-Header"] | | exposeHeaders | []string | 允许客户端访问的响应头 | ["X-Total-Count"] | | maxAge | string | 预检请求缓存时间 | "86400s" (24小时) | | allowCredentials | bool | 是否允许发送凭据(cookie等) | true |
配置合并策略
当虚拟主机和路由都配置了 CORS 时,Gloo 提供了灵活的合并策略控制:
virtualHost:
options:
corsPolicyMergeSettings:
exposeHeaders: UNION # 合并所有exposeHeaders
allowMethods: REPLACE # 路由配置覆盖虚拟主机配置
cors:
# 虚拟主机CORS配置
支持三种合并策略:
- REPLACE:路由配置完全覆盖虚拟主机配置(默认)
- IGNORE:忽略路由配置,使用虚拟主机配置
- UNION:合并两者配置
实践建议
- 最小权限原则:仅开放必要的源、方法和头部
- 正则表达式使用:对于动态子域名,使用 allowOriginRegex 而非通配符
- 凭据安全:当 allowCredentials 为 true 时,allowOrigin 不能使用通配符(*)
- 预检缓存:合理设置 maxAge 减少 OPTIONS 请求
- 测试验证:使用 curl 或 Postman 测试 CORS 头部是否正确返回
常见问题排查
-
CORS 头部未生效:
- 检查是否被应用自身的 CORS 中间件覆盖
- 确认配置已正确应用到 VirtualService
-
预检请求失败:
- 确保 OPTIONS 方法在 allowMethods 中
- 检查所有自定义头部是否在 allowHeaders 中
-
凭据不被发送:
- 检查 allowCredentials 是否为 true
- 前端请求需设置 withCredentials: true
通过合理配置 Gloo 网关的 CORS 策略,可以既保障 API 的安全性,又满足现代 Web 应用跨域访问的需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考