首页 > 解决方案 > 由于缺少 Origin 标头 + CORS,从 S3 下载 Unity3D WebGL 网络失败

问题描述

我在尝试从我们的 S3 CDN 下载资源时遇到了一些问题。

我们似乎在 S3 上正确设置了 CORS。

S3 CORS故障排除指南指出您需要发布“Origin”标头,否则它将忽略所有 CORS 标头:

如果缺少标头,Amazon S3 不会将该请求视为跨域请求,并且不会在响应中发送 CORS 响应标头。

我已经使用 curl 进行了测试,以确保返回相关的 CORS 标头,并且我可以看到只有在发送“Origin”标头时才会返回这些标头。

例如:如果我运行以下命令:

curl -v -H "Origin: http://localhost" https://cdn.myurl.com/mybucket/mystuff.json

我收到以下标题(以及一系列其他信息):

access-control-allow-origin: *
access-control-allow-methods: GET, POST, HEAD

但是,当我不传递 Origin 标头时,这些返回标头会丢失:

curl -v https://cdn.myurl.com/mybucket/mystuff.json

我正在尝试使用 UnityWebRequest 获取请求来拉取数据。当我通过 WebGL 运行我的应用程序时,我可以在调用 request.SendWebRequest() 时看到异常

无法加载https://cdn.myurl.com/mybucket/mystuff.json:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源“ http://localhost:17936 ”。

我只能假设 UnityWebRequest 没有发送“Origin”标头。

我无法显式设置标题,因为如果这样做,我会收到错误消息:

UnityWebRequest request = UnityWebRequest.Get(uri);
request.SetRequestHeader("Origin", "http://localhost");

InvalidOperationException:无法覆盖系统指定的标头

在这一点上我很困惑。


更新:

@sideshowbarker 提到 Origin 标头是由浏览器自动添加的,所以这对我来说可能是一个红鲱鱼。

他们还建议我需要查看浏览器工具中的请求标头。这是我在浏览器中查看 WebGL 应用程序对该特定对象的请求时看到的内容:

Web 请求标头

这里有几个我感兴趣的点。

我能想到的唯一其他混合工具是我们在 S3 存储桶前使用 CloudFlare。我相信这不会引起问题,因为它应该转发 CORS 标头,但我会绕过 CloudFlare 进行测试。

标签: unity3damazon-s3corsunity-webgl

解决方案


只需将“HEAD”请求添加到亚马逊的 cors 配置中

[
{
    "AllowedHeaders": [
        "*"
    ],
    "AllowedMethods": [
        "GET",
        "POST",
        "HEAD"
    ],

推荐阅读