这里涉及到一个概念:预检请求(preflight request),请看下面"预检请求"的介绍。...给OPTIONS 添加 204的返回 是为了处理在发送POST请求时Nginx依然拒绝访问的错误,发送"预检请求"时,需要用到方法 OPTIONS ,所以服务器需要允许该方法。...其实Content-Type字段的类型为application/json的请求就是上面所说的搭配某些 MIME 类型的 POST 请求,CORS规定,Content-Type不属于以下MIME类型的,都属于预检请求... 所以 application/json的请求 会在正式通信之前,增加一次"预检"请求,这次"预检"请求会带上头部信息 Access-Control-Request-Headers: Content-Type...省略了一些 服务器回应时,返回的头部信息如果不包含Access-Control-Allow-Headers: Content-Type则表示不接受非默认的的Content-Type。
,浏览器回自动在请求的头部添加一个 Origin 字段来说明本次请求来自哪个源(协议 + 域名 + 端口),服务端则通过这个值判断是否接收本次请求。...它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。Access-Control-Expose-Headers:该字段可选。...Access-Control-Max-Age:该字段可选,用来指定本次预检请求的有效期,单位为秒,在此期间,不用发出另一条预检请求。...[可选]服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段 context.Header("Access-Control-Allow-Headers", "Content-Type,...[可选]服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段 w.Header().Set("Access-Control-Allow-Headers", "Content-Type
预检请求 预检请求是在发送实际的请求之前,客户端会先发送一个 OPTIONS 方法的请求向服务器确认,如果通过之后,浏览器才会发起真正的请求,这样可以避免跨域请求对服务器的用户数据造成影响。...预检请求示例 通过一个示例学习下预检请求。 设置客户端 为 index.html 里的 fetch 方法增加一些设置,设置请求的方法为 PUT,请求头增加一个自定义字段 Test-Cors。...这里如果 content-type 指定的为简单请求中的几个值,Access-Control-Request-Headers 在告诉服务器时,实际请求将只有 test-cors 这一个头部字段。...首先预检请求时,浏览器给了服务器几个重要的信息 Origin、Method 为 PUT、Headers 为 content-type,test-cors 服务端在收到之后,也要做些设置,给予回应。...Access-Control-Allow-Headers 表示服务器允许请求中携带 Test-CORS、Content-Type 字段,也可以设置多个。
这是因为服务器不允许跨域请求,这里会深入讲一讲OPTIONS请求。 只有在满足一定条件的跨域请求中,浏览器才会发送OPTIONS请求(预检请求)。这些请求被称为“非简单请求”。...对于非简单请求,浏览器会在实际请求(例如PUT、DELETE、PATCH或具有自定义头部和其他Content-Type的POST请求)之前发送OPTIONS请求(预检请求)。...使用了一个自定义HTTP头部 “X-Custom-Header”,这不在允许的头部列表中。 因为这个请求不满足简单请求条件,所以在实际POST请求之前,浏览器会发送OPTIONS请求(预检请求)。...总结:当进行非简单跨域POST请求时,浏览器会在实际POST请求之前发送OPTIONS预检请求,询问服务器是否允许跨域POST请求。如果服务器不允许跨域请求,浏览器控制台会显示跨域错误提示。...因此,当服务器返回OPTIONS响应时,响应中主要包含跨域配置信息,而不会包含实际的业务数据 本地调试一下,前端发送POST请求,后端在POST方法里面打断点调试时,也不会阻碍OPTIONS请求的返回
跨域主要涉及4个响应头: Access-Control-Allow-Origin 用于设置允许跨域请求源地址 (预检请求和正式请求在跨域时候都会验证) Access-Control-Allow-Headers...跨域允许携带的特殊头信息字段 (只在预检请求验证) Access-Control-Allow-Methods 跨域允许的请求方法或者说HTTP动词 (只在预检请求验证) Access-Control-Allow-Credentials...什么是预检请求? 当发生跨域条件时候,览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。...这一设计旨在确保服务器对 CORS 标准知情,以保护不支持 CORS 的旧服务器 通过错误信息,我们可以得到是预检请求的请求响应头缺少了 Access-Control-Allow-Origin,错哪里,...意思就是预请求响应头Access-Control-Allow-Headers中缺少头信息authorization(各种情况会不一样,在发生跨域后,在自定义添加的头信息是不允许的,需要添加到请求响应头Access-Control-Allow-Headers
首部字段 Access-Control-Allow-Headers 表明服务器允许请求中携带字段 X-PINGOTHER 与 Content-Type。...当用在对preflight预检测请求的响应中时,它指定了实际的请求是否可以使用credentials。...请注意:简单 GET 请求不会被预检;如果对此类请求的响应中不包含该字段,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页。...Access-Control-Allow-Headers Access-Control-Allow-Headers 首部字段用于预检请求的响应。其指明了实际请求中允许携带的首部字段。...Access-Control-Allow-Headers: [, ]* 预检的过程 当预检请求到达服务端时,服务端是不会真正执行这个请求的逻辑的,只会在这个请求上返回一些
2.1 简单请求 当请求同时满足如下条件时,CORS验证机制会使用简单请求, 否则CORS验证机制会使用预检请求。...在Chrome和firefox下没有任何异常,但在IE11下报了如下的错: Access-Control-Allow-Headers 列表中不存在请求标头 content-type。...null : result); } 浏览器的执行效果如下: 4 preflight响应码:200 vs 204 后端配置完成之后,团队里的小伙伴问我:“勇哥,那预检请求返回的响应码到底是200还是...我司的API网关的预检响应码是200,CorsFilter预检响应码也是200。 MDN给的示例预检响应码全部是204。...最后,Kong的源码里预检响应码仍然是200,并没有和MDN保持同步。 我仔细查看了各大主流网站,95%预检响应码是200。
HTTP请求的方法是POST,请求头Content-Type字段为application/json。浏览器发现,这是一个非简单请求,就自动发出一个预检请求,要求服务器确认可以这样请求。...1.1预检请求 预检请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个域。...:该字段是一个用逗号分割的字符串,执行浏览器CORS请求会额外发送的头信息字段,上例是Content-Type; 1.2预检回应 服务器收到预检请求以后,检查了Origin、Access-Control-Request-Method...它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在预检中请求的字段。 Access-Control-Allow-Credentials:与简单请求时含义相同。...在有效期内,不用发出另一条预检请求 2.正常请求和回应 一旦服务器通过了预检请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。
跨域主要涉及4个响应头: Access-Control-Allow-Origin 用于设置允许跨域请求源地址 (预检请求和正式请求在跨域时候都会验证) Access-Control-Allow-Headers...跨域允许携带的特殊头信息字段 (只在预检请求验证) Access-Control-Allow-Methods 跨域允许的请求方法或者说HTTP动词 (只在预检请求验证) Access-Control-Allow-Credentials...这一设计旨在确保服务器对 CORS 标准知情,以保护不支持 CORS 的旧服务器 通过错误信息,我们可以得到是预检请求的请求响应头缺少了 Access-Control-Allow-Origin,错哪里,...意思就是预请求响应头Access-Control-Allow-Headers中缺少头信息authorization(各种情况会不一样,在发生跨域后,在自定义添加的头信息是不允许的,需要添加到请求响应头Access-Control-Allow-Headers...报错内容也讲的很清楚,在这个预请求中,PUT方法是不允许在跨域中使用的,我们需要改下Access-Control-Allow-Methods的配置(缺什么加上么,这里我只加了PUT,可以自己加全一点),
##响应 Access-Control-Allow-Origin: http://api.bob.com #请求时Origin字段的值或者是一个*(表示接受任意域名的请求) Access-Control-Allow-Credentials...: FooBar #CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段,为了能拿到字段就要设置 Content-Type: text...请求,会在正式通信之前增加一次HTTP查询请求,称为"预检"请求(preflight);如果浏览器否定了”预检”请求,会返回一个正常的HTTP回应,但是没有任何CORS相关的头信息字段,可以采用XMLHttpRequest...Access-Control-Allow-Methods: GET, POST, PUT #关键点,它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段...Access-Control-Allow-Headers: X-Custom-Header #关键点,它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段
跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的"预检"请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头。...首部字段 Access-Control-Allow-Headers 表明服务器允许请求中携带字段 X-PINGOTHER 与 Content-Type。...当用在对preflight预检测请求的响应中时,它指定了实际的请求是否可以使用credentials。...请注意:简单 GET 请求不会被预检;如果对此类请求的响应中不包含该字段,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页。...首部字段用于预检请求的响应。
最后,Access-Control-Max-Age给出以秒为单位的值,该值表示对预检请求的响应可以缓存多长时间而无需发送另一个预检请求。在这种情况下,86400秒是24小时。...该请求已重定向到“ https://example.com/foo”,对于需要预检的跨域请求是不允许的 请求需要进行预检,不允许遵循跨域重定向 CORS协议最初要求该行为,但后来更改为不再需要它。...访问控制允许方法部分 该Access-Control-Allow-Methods头指定访问资源时所允许的一种或多种方法。用于响应预检请求。上面讨论了请求被预检的条件。...访问控制允许标题部分 所述Access-Control-Allow-Headers报头在响应用于一个预检请求,以指示在进行实际请求时HTTP标头都可以使用。...访问控制请求标头部分 该Access-Control-Request-Headers发出的预检要求,让服务器知道什么实际的请求时HTTP标头的时候会用到头使用。
预检请求 预检请求是在发送实际的请求之前,前端服务会先发送一个 OPTIONS 方法的请求向服务器确认,如果通过之后,浏览器才会发起真正的请求,这样可以避免跨域请求对服务端的数据造成影响。...预检请求示例 设置前端服务 为 index.html 里的 fetch 方法增加一些设置,设置请求的方法为 PUT,请求头增加一个自定义字段 Test-Cors。...这里如果 Content-Type 指定的为简单请求中的几个值,Access-Control-Request-Headers 在告诉服务器时,实际请求将只有 Test-Cors 这一个头部字段。...Access-Control-Allow-Headers 表示服务器允许请求中携带 Test-CORS、Content-Type 字段,也可以设置多个。...Access-Control-Max-Age 表示该响应的有效期,单位为秒。在有效时间内,浏览器无须为同一请求再次发起预检请求。
这也就是为什么会出现通过 API 请求工具调用接口的时候没有问题,但通过浏览起发起请求时就会出现跨域警告。 4. 跨域请求,浏览器会做什么?...请求发出 简单请求请求方法:GET、HEAD、POST 请求头部字段:Accept、Accept-Language、Content-Language、Content-Type(只能是这三个值之一:application...Access-Control-Allow-Headers(服务端设置的允许携带的请求头部字段): 该请求头字段是否超出了设置范围则。...Access-Allow-Max-Age(本次预检请求的有效时长): 如果设置了且未超过有效时长,则不用重复发送预检请求。...非简单跨域请求发送的预检请求确认服务端不允许该请求,则会忽略后续请求,不发送真实请求。 5. 如何解决跨域限制 JSONP浏览器允许嵌入跨域资源的请求: <script src="...
22、非简单请求(not-so-simple request) 2.1 预检请求 非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application..."预检"请求用的请求方法是 OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。除了Origin字段,"预检"请求的头信息包括两个特殊字段。...它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。...(3)Access-Control-Allow-Credentials 该字段与简单请求时的含义相同。...截图参考: 2.3 浏览器的正常请求和回应 一旦服务器通过了"预检"请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。
注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200。 如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。...非简单请求 预检请求 非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。..."预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。...*/ 预检请求的回应 服务器收到"预检"请求以后,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,...浏览器的正常请求和回应 一旦服务器通过了"预检"请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。
如果服务器未返回正确的响应首部,则请求方不会收到任何数据。因此,那些不允许跨站点请求的网站无需为这一新的 HTTP 访问控制特性担心。...预检请求 非简单请求时那种对服务器有特殊要求的请求,比如请求方法是 PUT 或 DELETE,或者 Content-Type 字段的类型是 application/json。...Tips:预检请求可以在调试器 Network 选项卡中查看,如下图: 2....字段是必须的,它也是一个逗号 , 分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在“预检请求”的字段。...浏览器的正常请求和回应 一旦服务器通过了“预检请求”,以后每次浏览器正常的 CORS 请求,就都跟简单请求一样,会有一个 Origin 头信息字段。
对于“简单的” GET 或 POST 请求,如果服务器没有对其作出携带特殊 HTTP 头部的响应 -- 请求依然被发送并且数据也照样被返回,但浏览器将不允许 Javascript 访问该响应。.../form-data、text-plain三者之一的),则被称为预检(preflight)的机制将被用到,并且一个 OPTIONS 请求会被发往服务器。...关于“没那么简单”的请求,一个常见的例子是在请求中加入 cookie 或自定义头部 -- 如果浏览器发送了这样的请求且服务器没有正确响应的话,则只有预检调用会发送(不包含额外的头部),而浏览器本应使用的真实的...在 CORS 请求和响应中,都用到了一些 HTTP 头部,其中以下这几个是你必须理解的: Origin 该头部是客户端发起的请求的一部分,包含了应用所在的域。...Access-Control-Allow-Credentials 该头部只需要在服务器支持通过 cookie 认证的情况下出现在响应中。这种情况下,其唯一合法值就是 true。 ?
跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的“预检”请求。...标头字段 Access-Control-Allow-Headers 表明服务器允许请求中携带字段 X-PINGOTHER 与 Content-Type。...当用在对 preflight 预检测请求的响应中时,它指定了实际的请求是否可以使用 credentials。...请注意:简单 GET 请求不会被预检;如果对此类请求的响应中不包含该字段,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页。...Access-Control-Allow-Headers Access-Control-Allow-Headers标头字段用于预检请求 的响应。其指明了实际请求中允许携带的标头字段。