Cloudflare Worker配置CORS头为*仍拦截POST请求如何解决
排查与解决方法
你的报错核心是预检OPTIONS请求没有返回要求的CORS头,GET请求不需要预检所以能正常访问,POST因为触发预检才被拦截,按以下顺序排查即可:
- 优先检查是否单独处理了OPTIONS预检请求
多数新手会只给正常业务请求加CORS头,忽略了浏览器会先发送OPTIONS请求做预检,如果你没在Workers里单独对OPTIONS方法返回响应,请求会直接走到业务逻辑或者返回空响应,自然不会带CORS头。你需要在代码最前面优先判断请求方法,如果是OPTIONS,直接返回状态码204,带上你配置的三个CORS头即可。
示例代码参考:if (request.method === 'OPTIONS') { return new Response(null, { status: 204, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, HEAD, POST, OPTIONS', 'Access-Control-Allow-Headers': '*', 'Access-Control-Max-Age': '86400' } }) } - 检查本地wrangler配置是否有覆盖响应头
如果你用wrangler dev启动本地服务,检查wrangler.toml里是否配置了[headers]规则,或者启动命令是否加了头覆盖的参数,可能会把你代码里加的CORS头覆盖掉。 - 检查是否有中间件/路由逻辑提前返回了响应
如果你用了Workers的路由框架(比如itty-router、hono),检查是否有前置中间件、路由匹配失败的逻辑,或者异常捕获的分支,这些分支返回的响应如果没加CORS头,也会触发拦截。可以在代码最后返回响应的位置统一打印响应头,确认所有返回的响应都确实带上了目标头。 - 检查跨域凭证相关配置
如果你的请求带了Cookie或者Authorization凭证,Access-Control-Allow-Origin不能设为*,必须和请求的Origin完全匹配,同时要加Access-Control-Allow-Credentials: true头。你可以先把前端请求的withCredentials或者credentials配置关掉,测试是否能通,再调整配置。 - 清空本地缓存测试
浏览器会缓存CORS预检结果,可以先清空浏览器缓存,或者用无痕模式测试,避免旧的缓存响应影响测试结果。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

