Safari同源请求触发Fetch API访问控制检查错误的原因排查
在Web应用中调用
fetch()方法时,Safari浏览器中Promise被拒绝,Web Inspector控制台报错:Fetch API cannot load https://example.com/whatever due to access control checks.确认是同源请求且未启用广告拦截工具,除常规CORS问题外,还有以下可能的触发原因:
Safari隐私防护机制误判:Safari的"阻止跨站跟踪"功能可能将部分同源请求判定为跨站请求。比如页面通过第三方链接打开、请求携带的Cookie设置了
SameSite=None但未搭配Secure属性,或是请求来自嵌入在第三方页面中的同源iframe,都可能触发该拦截。资源MIME类型校验失败:若服务器返回的资源MIME类型与请求预期不符,Safari的安全策略会触发访问控制检查。例如请求JSON数据但服务器返回
text/plain类型,即使是同源请求,也可能被判定为风险请求。本地Hosts映射的特殊性:本地开发时修改
hosts文件将域名指向本地IP(如example.com指向127.0.0.1),Safari可能不认可这种映射的同源关系,将请求视为跨域处理。HTTP/HTTPS混合内容限制:当前页面为HTTPS协议,但请求的同源资源使用HTTP协议时,Safari会因混合内容安全限制拦截请求,部分场景下错误提示会归类到访问控制检查中。
服务器安全头配置异常:服务器返回的
Content-Security-Policy中connect-src规则限制了同源请求,或是Cross-Origin-Resource-Policy设置为same-site但请求不符合该规则,即使同源也会触发拦截。旧缓存策略干扰:若该域名曾有过跨域请求记录,Safari可能缓存了旧的访问控制策略,后续同源请求仍会受缓存规则影响。可尝试清除Safari的缓存与网站数据后重新测试。
内容的提问来源于stack exchange,提问作者Sophie Alpert

