在 Kong 网关的 declarative config YAML 文件中,通过配置 cors 插件的 methods 和 headers 字段实现特定跨域规则。适用场景是前后端分离架构下的跨域请求控制,风险边界是避免在生产环境对 origins 使用通配符且同时开启 credentials。
先说结论:通过 YAML 的 plugins 段落定义 cors 插件,将允许的方法和请求头写入 config 下的列表。
- 适合:Kong 网关使用 declarative config 管理配置的场景
- 先准备:确认前端业务实际需要的 HTTP Method 和自定义 Header 名称
- 验收:使用 curl 发送 OPTIONS 预检请求验证响应头
快速处理思路
直接编辑 kong.yml 文件,在 plugins 列表中添加 cors 配置项,无需执行复杂命令行。
plugins:
- name: cors
config:
origins:
- http://example.com
methods:
- GET
- POST
headers:
- Content-Type
- Authorization
credentials: true
max_age: 3600
为什么会这样
Kong 作为反向代理需要拦截浏览器的 OPTIONS 预检请求并注入正确的响应头。
浏览器出于安全策略,会在发送跨域 POST 或自定义 Header 请求前先发 OPTIONS 请求。Kong 的 cors 插件检测到该请求后,会根据 YAML 配置生成 Access-Control-Allow-Methods 等响应头,告诉浏览器后续请求是否被允许。
分步处理
按顺序修改配置文件并重载网关,每一步都需要确认语法正确。
- 编辑配置文件:打开 kong.yml 或 declarative 配置文件,找到 plugins 段落。
- 定义插件:添加 name 为 cors 的插件项,确保缩进符合 YAML 规范。
- 配置参数:在 config 下填写 methods 和 headers 列表,值必须与前端代码请求保持一致。
- 检查语法:执行 kong check -c kong.yml 确认配置无语法错误。
- 重载配置:执行 kong reload 或在容器环境重启 Pod 使配置生效。
怎么验证是否生效
使用 curl 命令模拟浏览器预检请求,检查响应头是否包含允许的方法和字段。
curl -X OPTIONS http://your-kong-ip/your-path \
-H "Origin: http://example.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: Authorization" \
-v
检查输出中是否包含 Access-Control-Allow-Methods: POST 和 Access-Control-Allow-Headers: Authorization。如果状态码为 200 或 204 且头信息匹配,则配置生效。
常见坑
- 通配符风险:origins 配置为 * 时,credentials 不能为 true,否则浏览器会拦截。
- 大小写敏感:Header 名称区分大小写,配置 Authorization 不要写成 authorization。
- 缺少 OPTIONS:methods 列表中必须显式包含 OPTIONS,否则预检请求可能失败。
常见问题
credentials 为 true 时 origins 能写 * 吗
不能,浏览器规范要求当允许携带凭证时,origins 必须指定具体域名。
配置后浏览器仍然报 CORS 错误怎么办
检查浏览器控制台 Network 面板,确认 OPTIONS 请求是否到达 Kong 以及响应头是否缺失。
methods 列表需要包含 GET 和 POST 吗
需要,列表应包含所有前端实际会使用的 HTTP 方法,不仅仅是当前报错的方法。
参考来源
- Kong Hub, CORS Plugin, https://docs.konghq.com/hub/kong-inc/cors/
- Kong Gateway, Declarative Configuration, https://docs.konghq.com/gateway/latest/production/deployment-topologies/declarative-config/