OPTIONS 请求过多

Too many OPTIONS requests

在我的应用程序中,前端(使用 axios 的 ReactJS,如果重要的话)对后端进行一些 API 调用(Node/Express,如果重要的话)。在所有响应中,服务器确实以 Access-Control-Allow-Origin:* 响应(这是一个测试环境,将进行适当的更改以允许生产中的特定来源)。

在 Chrome Developer Tools Network 选项卡中,我观察到对于每个请求 POST /assetsPOST /filtersPUT /media 等,都会发送预检 OPTIONS 请求.现在我明白了 from here 的原因,这很好。

选项请求Headers

OPTIONS /api/v1/content/bb54fbf52909f78e015f/f91659797e93cba7ae9b/asset/all 
HTTP/1.1
Host: XX.X.XX.XXX:5000
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36     (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36    
Access-Control-Request-Headers: authorization,content-type
Accept: */*
DNT: 1
Referer: http://localhost:3000/main/93f1ced0f15f35024402/assets
Accept-Encoding: gzip, deflate
Accept-Language: en,en-US;q=0.8,mr;q=0.6

回复Headers

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,HEAD,PUT,PATCH,POST,DELETE
Vary: Access-Control-Request-Headers
Access-Control-Allow-Headers: authorization,content-type
Date: Sat, 05 Aug 2017 10:09:16 GMT
Connection: keep-alive

我的观察是,这实际上是为每个请求发送的,并且是重复发送的,即即使再次发出相同的请求(立即或以其他方式)。

我的问题是

  1. 这一定是件坏事吗(即它会导致任何性能问题,甚至是轻微的问题)吗?

  2. 为什么浏览器不记得同一服务器、同一请求的 header 响应?

  3. 我是否缺少在前端或后端配置以使其具有粘性的内容?

您需要发送 Access-Control-Max-Age header 来告诉浏览器可以将您的其他 Access-Control-* header 缓存那么多秒:

Access-Control-Max-Age: 600