微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尽管“ Vary:Origin”

如何解决尽管“ Vary:Origin”

我有一个在生产服务器上运行的REST API,以及使用该API的同一网站的多个部署(用于开发)。具体来说,我使用一个测试子域以及一个本地服务器。

现在,当我使用干净的缓存访问测试网站时,一切都很好。然后,我访问我的生产网站,由于测试网站的响应标头已缓存,API请求将被阻止。

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.WEBSITE.com/entity?page=1&itemsPerPage=24. (Reason: CORS header ‘Access-Control-Allow-Origin’ does not match ‘https://test.WEBSITE.com’).

如果我理解正确,vary: Origin应该阻止Firefox使用来自不同来源的相同的缓存响应标头,但我们开始:

OPTIONS请求标头

Host: api.WEBSITE.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip,deflate,br
Access-Control-Request-Method: GET
Access-Control-Request-Headers: cache-control,pragma
Referer: https://www.WEBSITE.com/
Origin: https://www.WEBSITE.com
Connection: keep-alive
TE: Trailers

OPTIONS响应标头

HTTP/2 200 OK
date: Mon,24 Aug 2020 19:03:34 GMT
server: Apache/2.4.29 (Ubuntu)
cache-control: no-cache,private
vary: Origin
access-control-allow-methods: GET,OPTIONS,POST,PUT,DELETE,PATCH
access-control-allow-headers: content-type,authorization,cache-control,pragma
access-control-max-age: 3600
access-control-allow-origin: https://www.WEBSITE.com
content-length: 0
content-type: text/html; charset=UTF-8
X-Firefox-Spdy: h2

获取响应标头(已缓存)

HTTP/2 200 OK
date: Mon,24 Aug 2020 18:39:16 GMT
server: Apache/2.4.29 (Ubuntu)
vary: Accept,Content-Type,Authorization,Origin
x-content-type-options: nosniff
x-frame-options: deny
cache-control: max-age=3600,public,s-maxage=3600
access-control-allow-origin: https://test.WEBSITE.com
access-control-expose-headers: link,vary
link: <https://api.WEBSITE.com/docs.jsonld>; rel="http://www.w3.org/ns/hydra/core#apiDocumentation"
etag: "0acc3f17cbf989d0a7176038188463df"
content-type: application/ld+json; charset=utf-8
X-Firefox-Spdy: h2

如何防止Firefox使用缓存的标头?在Chrome上运行正常。这是Firefox错误吗?


更新

我的OPTIONS请求也得到了304的响应,因此我检查了服务器配置。
当我将服务器上的PHP版本更改回Apache的PHP7.4时,它可以工作。但是,我想使用HTTP / 2和mpm_event,它们显然仅适用于PHP7.4-fpm。
我比较了已启用的配置文件,但找不到两个PHP版本之间的任何区别。我的猜测是,一个版本没有将ETag传递给我的API,或者其他版本没有传递。

无论如何,我认为问题出在我使用的框架Symfony + API-Platform之内。我检查了来自不同来源的请求的ETag,并且两者相等。如何考虑原产地?
我已经在API平台配置中设置了vary: ['Accept','Content-Type','Authorization','Origin','User-Agent']

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。