【发布时间】:2017-04-29 04:27:46
【问题描述】:
我的公司有许多应用程序请求 AWS S3 上的共享资源。其中一些应用程序使用crossorigin="anonymous" html 元素,而另一些则不使用。 AWS 不会发回 CORS 响应标头,例如“Allow-access-control-origin”when there is no Origin request header。因此,一些用户可能会使用没有 CORS 响应标头的文件的浏览器缓存版本。
当这些用户访问我团队的应用程序时,Service Worker 可能无法请求这些共享资产,因为浏览器磁盘缓存以非 cors 方式拥有它们。错误如下所示:
请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:8001' 不允许访问。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
当然,我不能使用不透明的响应来进行可靠的缓存。
我想我可以应用缓存控制请求标头来绕过浏览器缓存,但 Fetch API Request is immutable 的 Headers 对象。因此,我无法向现有请求添加标头。如果我尝试发出新请求,我无法从 AWS 获得 CORS 响应,因为我无法在 Fetch API 中设置 Origin is a forbidden header。
如果满足以下条件,此问题将得到解决:
我可以强制公司中的所有团队确保他们使用跨域 html 属性,但我不能。
我可以让 AWS 始终使用 CORS 标头进行响应,但我不能。
使用 Origin 标头发出 Fetch Request,但我不能。
说服我的组织设置缓存控制标头,禁止浏览器缓存资产,但这是个坏主意。
我能做些什么来克服这个问题吗?现在,我只是在这些共享资产上禁用 Service Worker 缓存,以避免网络故障。
【问题讨论】:
-
Allow-access-control-origin- 你的意思是Access-Control-Allow-Origin吗? -
the Headers object of the Fetch API Request is immutable在非常特殊的情况下 - 我不明白为什么你不应该设置请求标头 -
Origin is a forbidden header that I cannot set in the Fetch API- 浏览器控制 Origin 标头,为什么需要更改它? -
是的,我的意思是访问控制允许来源。
标签: javascript amazon-s3 cors service-worker