You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于CORS预检请求:当Access-Control-Allow-Methods未包含POST时,浏览器是否会拦截POST请求?

浏览器会拦截该实际请求,不会发送它

你之前的理解是完全正确的——浏览器会严格校验预检响应中的Access-Control-Allow-Methods是否包含实际请求要使用的方法,只要不匹配就会拦截后续请求,哪怕服务器返回了204状态码也没用。

具体原因拆解:

  • 预检请求的核心作用:
    预检(OPTIONS请求)是浏览器用来"提前确认权限"的机制:它会明确告诉服务器「我接下来要发一个用POST方法、带x-my-custom-header头的请求,你是否允许?」。服务器的响应必须精准匹配这些要求,浏览器才会继续发送实际请求。

  • 你的场景中的关键不匹配:
    你的预检请求已经通过Access-Control-Request-Method: POST告知服务器实际要用POST,但服务器响应的Access-Control-Allow-Methods: PUT,DELETE里完全没有包含POST。这直接违反了CORS规范的校验逻辑,浏览器会判定该请求不被允许。

  • 20x状态码的真正意义:
    204只是表示OPTIONS预检请求本身被服务器正常处理了,但这不等同于服务器允许实际请求。CORS的核心判断依据是响应头里的Access-Control-*系列字段,状态码仅保证预检请求没有服务器端错误(比如500),字段不匹配的话,浏览器依然会拦截后续操作。

补充一个容易混淆的细节:

如果你的请求是简单请求(比如不带自定义头的普通POST,且Content-Type是application/x-www-form-urlencoded这类允许的类型),浏览器不会触发预检,会直接发送请求后再根据响应头判断是否允许。但你的请求带了自定义头x-my-custom-header,属于非简单请求,必须走预检流程,所以这个校验是绕不开的。

内容的提问来源于stack exchange,提问作者Joe Markov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:32:26