服务器响应304

时间:2016-10-26 07:33:09

标签: web xmlhttprequest cors

我有一个API服务器api.example.com和两个网站a.example.comb.example.com。为了启用CORS,我为它们设置了CORS头。

来自a.example.com的XHR请求将获得api.example.com

的响应标头
access-control-allow-credentials: true
access-control-allow-methods: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS
access-control-allow-origin: https://a.example.com
access-control-max-age: 0
vary: origin

同样,来自b.example.com的XHR请求将获得api.example.com

的响应标头
access-control-allow-credentials: true
access-control-allow-methods: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS
access-control-allow-origin: https://b.example.com
access-control-max-age: 0
vary: origin

当我在GET api.example.com/articles/1中提取资源a.example.com然后转到b.example.com时,请执行相同操作以获取资源。浏览器将使用if-none-match标头获取资源,并从服务器接收304响应代码。然后它抱怨Access-Control-Allow-Origin标头的值https://a.example.com不等于提供的原点。因此,不允许原始https://b.example.com访问。

我认为浏览器在304被响应时使用其缓存,并且发现Access-Control-Allow-Origin被缓存为a.example.com的资源,因此拒绝履行请求。

如何在此处缓解此问题?有什么想法?

1 个答案:

答案 0 :(得分:1)

缓存请求,包括其内容和标题。

第一次访问时。生成响应并将其保存在缓存中。

之后访问b时。 304响应没有标题,没有内容,它只是指示浏览器使用缓存。缓存的响应具有其他站点的标头,并且会引发访问错误。

这两个请求不应该用304来回答,因为它们不相同。

If-None-Match表示页面标识为en ETag。应用程序生成的任意字符串,用于标识页面的可缓存版本。

您应该修改应用程序,为不同的ETag生成不同的Origin