每次CORS请求前必须发送预检请求吗?JioCinemas预检疑问
关于JioCinemas IPL赛事请求重复预检的问题解答
为什么每次都发送预检请求?
预检请求(OPTIONS)的缓存完全由服务端返回的Access-Control-Max-Age响应头控制。如果JioCinemas的CDN未配置这个头,或是将缓存时长设为0,浏览器就会在每次跨源请求前触发预检。
除此之外还有两种常见诱因:
- 请求属于非简单请求:比如携带了自定义HTTP头(如鉴权、防盗链相关字段),或是请求的MIME类型不属于简单范畴(视频流请求基本符合这个特征),这类场景下浏览器必须发起预检,无缓存时就会重复发送。
- 请求特征维度变化:浏览器的预检缓存是基于「请求源、目标域名、HTTP方法、自定义头集合」的组合维度。如果每次请求的自定义头存在差异(比如带了不同的临时token),或是URL参数导致请求特征改变,浏览器会判定为新请求,重新发起预检。
能不能将预检请求缓存30秒或1分钟?
完全可以,但需要JioCinemas的服务端/CDN调整配置:
- 在OPTIONS预检请求的响应中添加
Access-Control-Max-Age: 30(单位为秒),浏览器就会将预检结果缓存30秒,这段时间内同特征的跨源请求不会再触发预检。 - 注意:不同浏览器对该值有上限限制,比如Chrome默认上限为600秒(10分钟),超过的数值会被浏览器自动截断为上限值。
你可能忽略的细节
- 简单请求的例外规则:如果是简单请求(仅限GET/POST/HEAD方法,请求头仅包含
Accept、Accept-Language等简单字段,Content-Type为application/x-www-form-urlencoded、multipart/form-data或text/plain),浏览器不会发起预检。但视频流请求几乎都会携带自定义头,必然属于非简单请求,必须走预检流程。 - CDN的特殊缓存策略:部分CDN默认不缓存OPTIONS请求,或是会过滤掉
Access-Control-Max-Age响应头,这也会导致每次跨源请求都触发预检。 - 预检缓存的会话限制:预检缓存仅在当前浏览器页面会话内有效,关闭页面后缓存会直接失效。
(参考你提供的网络面板截图)
内容的提问来源于stack exchange,提问作者koteshwarrao maripudi
相关产品推荐
相关产品推荐

