我有一个API服务器api.example.com
和两个网站a.example.com
,b.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
的资源,因此拒绝履行请求。
如何在此处缓解此问题?有什么想法?
答案 0 :(得分:1)
缓存请求,包括其内容和标题。
第一次访问时。生成响应并将其保存在缓存中。
之后访问b时。 304响应没有标题,没有内容,它只是指示浏览器使用缓存。缓存的响应具有其他站点的标头,并且会引发访问错误。
这两个请求不应该用304来回答,因为它们不相同。
If-None-Match
表示页面标识为en ETag
。应用程序生成的任意字符串,用于标识页面的可缓存版本。
您应该修改应用程序,为不同的ETag
生成不同的Origin
。