Kong Ingress处理OPTIONS请求报CORS错误,React跨域调用失败求助
问题背景
我是Kong新手,正在使用Kong的CORS插件,已在kong.yml中完成所有配置。端点部署成功且可通过Postman正常访问,但不同域名的React UI调用该端点时,出现预检CORS错误,云服务商为Google Cloud Platform。
CORS插件配置(plugins.yaml)
plugins: - name: cors service: my-service-name protocols: - grpc - grpcs - http - https config: origins: - '*' headers: - Origin - Authorization - X-Requested-With - Content-Type methods: - GET - PUT - PATCH - POST - DELETE - OPTIONS max_age: 3600 credentials: true preflight_continue: true enabled: true
已尝试操作
- 将
preflight_continue设为true和false - 添加不同请求头
以上操作均无效
报错详情
Access to XMLHttpRequest at 'https://my_Kong_url' from origin 'https://my_react_server' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
POST 'https://my_kong_url' net::ERR_FAILED
客户端代码(React)
fetch(<url>, <body>)
排查与解决建议
确认插件绑定对象是否正确
检查插件是否确实关联到目标服务my-service-name,若服务级绑定未生效,尝试将插件绑定到具体路由上测试。修复
credentials与origins的冲突
当credentials: true时,origins不能设为*,浏览器会直接拒绝该配置。将origins改为你的React域名:
config: origins: - 'https://my_react_server' # 其余配置保持不变
- 验证Kong是否处理OPTIONS请求
用curl手动发送OPTIONS请求,检查响应头是否包含CORS相关字段:
curl -X OPTIONS https://my_Kong_url -H "Origin: https://my_react_server" -I
若响应头无Access-Control-Allow-Origin,说明插件未生效,需重启Kong服务确保配置加载。
排查GCP层拦截
若Kong前端有GCP负载均衡,确认其未拦截OPTIONS请求;同时检查GCP防火墙规则,确保允许OPTIONS请求通过。修正客户端fetch配置
开启credentials: true后,客户端请求需携带credentials参数:
fetch(<url>, { method: 'POST', credentials: 'include', body: <your-body>, headers: { 'Content-Type': 'application/json' // 根据实际请求调整 } })
内容的提问来源于stack exchange,提问作者user7078

