Kong 网关插件配置 CORS 规则允许特定 Method 和 Header 怎么编写 yaml

文章导读
在 Kong 网关的 declarative config YAML 文件中,通过配置 cors 插件的 methods 和 headers 字段实现特定跨域规则。适用场景是前后端分离架构下的跨域请求控制,风险边界是避免在生产环境对 origins 使用通配符且同时开启 credentials。
📋 目录
  1. A 快速处理思路
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

在 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 网关插件配置 CORS 规则允许特定 Method 和 Header 怎么编写 yaml
  1. 编辑配置文件:打开 kong.yml 或 declarative 配置文件,找到 plugins 段落。
  2. 定义插件:添加 name 为 cors 的插件项,确保缩进符合 YAML 规范。
  3. 配置参数:在 config 下填写 methods 和 headers 列表,值必须与前端代码请求保持一致。
  4. 检查语法:执行 kong check -c kong.yml 确认配置无语法错误。
  5. 重载配置:执行 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/