由于缺少Origin标头+ CORS

时间:2018-08-23 05:44:00

标签: unity3d amazon-s3 cors unity-webgl

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

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

S3 CORS troubleshooting guide指出您需要发布“ Origin”标头,否则它将忽略所有CORS标头:

  

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

我已经使用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 get请求提取数据。通过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 Request Headers

我这里有几个有趣的地方。

  • 在“请求”标头中,有一个注释,其中显示了临时标头。我认为那意味着浏览器工具正在最佳地猜测正在发送哪些标头?
  • 请求成功-我收到200(成功)响应代码。内容长度标头(42)是我期望的正确大小。游戏代码只是由于缺少CORS标头而失败。
  • 该图像显示200响应代码,并带有注释“(来自磁盘缓存)”。我已经清除了缓存并重新运行它,并且第一次命中(我的代码进行了重试)不能正确地从缓存中加载,但仍未通过CORS测试。

在这里,我能想到的唯一的其他扳手是我们在S3存储桶前面使用CloudFlare。我认为这不会引起问题,因为它应该转发CORS标头,但我将绕过CloudFlare做一个测试。

2 个答案:

答案 0 :(得分:0)

您必须将CORS策略添加到托管游戏的S3存储桶中。 AWS Documentaion.这将允许您随后进行https调用和Rest API调用等。这是存储桶设置,而不是游戏设置。

答案 1 :(得分:0)

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

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