Cross-site requests are preflighted like this since they may have implications to user data. In particular,a request is preflighted if: - It uses methods other than GET,HEAD or POST. Also,if POST is used to send request data with a Content-Type other than application/x-www-form-urlencoded,multipart/form-data,or text/plain,e.g. if the POST request sends an XML payload to the server using application/xml or text/xml,then the request is preflighted. - It sets custom headers in the request (e.g. the request uses a header such as X-PINGOTHER)
但是,我发送的每个请求都有预检(OPTIONS)请求,无论是GET还是POST,我发现它很奇怪(根据文档说的那样).
我设置了一些标题(我发送它与withCredentials:true),但我不认为它应该是问题:
headers.append('Access-Control-Allow-Origin',FRONTEND_URL); headers.append('Accept','application/json'); headers.append('Content-Type','application/json'); headers.append('Authorization',this._generateApiKey()); headers.append('Language',this._languageISOCode);
我错过了什么吗?
解决方法
即使对于GET请求,简单请求中Content-Type标头的唯一允许值是application / x-www-form-urlencoded,multipart / form-data和text / plain.任何其他Content-Type值都会触发浏览器进行预检.
这是因为Fetch规范(定义了CORS行为)指定了它所称的CORS-safelisted request-header,它定义为以下之一:
>接受
>接受语言
>内容 – 语言
> Content-Type,其值一经解析,就具有MIME类型(忽略参数),即application / x-www-form-urlencoded,multipart / form-data或text / plain
任何请求 – 包括任何GET请求 – 包含不是CORS安全的请求标头的标头会触发预检.
为了使这一切更加清晰,我更新了the MDN documentation about CORS “simple requests”和the MDN documentation about CORS preflighted requests(它实际上比上面描述的稍微复杂一点 – 但是上面的内容足以满足这个问题的背景).
请注意,WebKit / Safari对Accept,Accept-Language和Content-Language标头中允许的值设置了额外的限制.
如果这些标题中的任何一个具有“非标准”值,WebKit / Safari将进行预检.
至于WebKit / Safari认为这些标题的“非标准”值,除了以下WebKit错误之外,没有真正记录:
> Require preflight for non-standard CORS-safelisted request headers Accept,Accept-Language,and Content-Language
> Allow commas in Accept,and Content-Language request headers for simple CORS
> Switch to a blacklist model for restricted Accept headers in simple CORS requests
没有其他浏览器实现这些额外的限制,因为它们不是规范的一部分.它们被单方面添加到WebKit,而没有与规范编辑器或其他浏览器进行任何讨论.