为什么跨源简单POST请求不会触发CORS预检检查?
为什么跨源简单POST请求不会触发预检检查?
嘿,这个问题问到点子上了!要搞懂这个,得从CORS的设计逻辑和Web历史兼容性两方面来看:
首先得明确:CORS里的预检请求(OPTIONS方法),本质是浏览器帮你提前“踩点”,确认目标服务器是否允许当前跨域请求的额外权限。但简单请求是浏览器判定为「要么安全风险极低,要么是Web早期就存在的传统行为」的请求类型,所以不需要多这一步预检。
根据相关文档的定义:
不会触发CORS预检的请求被称为“简单请求”……允许的方法仅包括:
- GET
- HEAD
- POST
……Content-Type头的允许值仅包括:- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
那为什么POST的这几种Content-Type能被归为简单请求呢?
答案是历史兼容性:早在上世纪90年代,HTML表单就支持跨域提交数据了——比如早年的第三方支付跳转、跨站论坛登录,都是靠这种方式实现的。浏览器一直默认允许这种行为,如果突然给这类请求加上预检,会导致大量旧网站的传统功能直接失效,这显然是不合理的。
再说说你提到的那个诱骗场景:用户访问evilsite.com后被诱导提交表单到elsewhere.com,这其实就是浏览器原生允许的跨域表单提交行为,完全符合简单请求的规则。不过别担心,这里有个关键的安全限制:这种跨域表单提交后,浏览器是不允许JavaScript读取返回的响应内容的,只能触发页面跳转——这就避免了恶意站点通过这种方式窃取目标站的敏感数据。
内容的提问来源于stack exchange,提问作者Afs35mm




